2013-07-19 6 views
0

겹쳐지지 않은 색상이있는 사각형이 많은 이미지가 있습니다. 각 직사각형은 고유 한 색상이며, 미리 색상을 알고 있습니다. (이상한 상황, 나도 알아.) 나는 각 사각형의 픽셀 위치와 크기를 찾으려고 노력하고 있으며 가능한 한 빨리이 것이 필요하다. 모든 단일 픽셀을 반복하는 것보다 쉽게이 작업을 수행 할 수 있도록 RMagick 또는 이와 유사한 라이브러리로 수행 할 수있는 흥미로운 트릭이 있습니까?RMagick으로 색상 위치 찾기

나의 현재 계획의 라인을 따라 뭔가 : 루프의 끝에서

for each pixel (moving left-to-right, top-to-bottom): 
    if pixel color's in our list and we haven't seen it yet: 
    save pixel location as starting location for that color 
    else if pixel color's in our list and we've already seen it: 
    save pixel location as ending location for that color 

(우리는 그들이 사각형에있어 알고 있다면 예, 우리는 픽셀의 특정 지역을 최적화하고 건너 뛸 수 있습니다.) 각 직사각형의 첫 번째와 마지막 픽셀을 가져야하며, 직사각형 차원을 추론하는 데 사용할 수 있습니다. 그러나 이것은 다소 나에게는보기 흉한 것처럼 보입니다.

더 잘할 수 있습니까?

+0

최소 직사각형 크기에 제약이 있습니까? "사각형"은 1x1 픽셀 일 수 있습니까? 그들이 더 커야 만한다면, 그 지식을 사용하여 더 나아질 수 있습니다. –

답변

1

이 답변은 최소한의 사각형 크기 (이상적으로는 최소 3x3)가있는 경우에만 작동하므로 추가 복잡성이 발생합니다.

최소 직사각형 크기가 (m, n)이라고 가정하면 대략적인 시작점과 끝점을 얻기 위해 제안 된 알고리즘을 해당 단계 크기로 실행 한 다음 픽셀 단위 (두 개의 L 자 모양 경로) 어디 두 반대 모서리입니다. 전체 이미지를 스캔하는 것보다 작은 수의 픽셀을 항상 확인한다는 것을 보여줄 수 있습니다.

for each pixel (moving left-to-right step m, top-to-bottom step n): 
    if pixel color's in our list and we haven't seen it yet: 
    save pixel location as rough starting location (xs,ys) for that color 
    save pixel location as rough ending location (xe,ye) for that color 
    else if pixel color's in our list and we've already seen it: 
    save pixel location as rough ending location (xe,ye) for that color 

그런 다음 수정 위치

for each color 
    with starting location (xs , ys) 
    while color at (xs, ys - 1) is same, update ys = ys - 1 
    while color at (xs - 1, ys) is same, update xs = xs - 1 
    with ending location (xe , ye) 
    while color at (xe, ye + 1) is same, update ye = ye + 1 
    while color at (xe + 1, ye) is same, update xe = xe + 1 

최소 크기는 3 × 3 인 경우,이 찾을 수 20 개 사각형이며, 이미지가 100 × 100이다 :

  • 전체 검색 10000 개 픽셀을 읽을 것
  • 최적화 된 스캔은 33x33 픽셀을 읽은 다음 20x10 더 읽기 (평균)로 20 개의 사각형을 각각 미세 조정합니다. 총 1289 픽셀.
+0

스텝 사이즈가 좋은 생각! 나는 이것을 많이 좋아한다. – JacobEvelyn