2014-09-25 2 views
0

다음 방법을 사용하여 이진 이미지에서 원하는 가장자리의 경계를 얻으려고합니다. 슬프게도 내 수학은 나를 실망시키는 것처럼 보입니다. 원본 이미지보다 각 치수가 2 배 작은 직사각형을 얻을뿐입니다.이진 이미지에서 경계 사각형 계산

누군가 내가 잘못한 곳을 표시 할 수 있습니까?

참고. FastBitmap은 픽셀 데이터에 빠르게 액세스 할 수있는 클래스입니다.

private Rectangle FindBox(Bitmap bitmap, byte indexToRemove) 
{ 
    int width = bitmap.Width; 
    int height = bitmap.Height; 
    int minX = width; 
    int minY = height; 
    int maxX = 0; 
    int maxY = 0; 

    using (FastBitmap fastBitmap = new FastBitmap(bitmap)) 
    { 
     for (int y = 0; y < height; y++) 
     { 
      for (int x = 0; x < width; x++) 
      { 
       if (fastBitmap.GetPixel(x, y).B == indexToRemove) 
       { 
        if (x < minX) 
        { 
         minX = x; 
        } 

        if (x > maxX) 
        { 
         maxX = x; 
        } 

        if (y < minY) 
        { 
         minY = y; 
        } 

        if (y > maxY) 
        { 
         maxY = y; 
        } 
       } 
      } 
     } 
    } 

    // check 
    if ((minX == width) && (minY == height) && (maxX == 0) && (maxY == 0)) 
    { 
     minX = minY = 0; 
    } 

    return new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1); 
} 

이미지를 테스트하고 있습니다.

Sully

답변

1

당신은 일치하는 모든 x와 y에 존재하는지 확인하기 위해 모든 픽셀을 확인하는 것으로 나타났습니다. 대신 minx, maxx, miny 및 maxy를 별도로 확인하십시오.

minY의 경우 일치하는 픽셀이있는 y 행을 칠 때까지 맨 위부터 시작하여 각 행을 아래로 확인해야합니다.

maxY의 경우 하단에서 시작하여 일치하는 픽셀이있는 y 행을 칠 때까지 각 행을 확인해야합니다.

minX의 경우 왼쪽에서 시작하여 일치하는 픽셀이있는 x 열을 칠 때까지 각 열을 확인해야합니다.

maxX의 경우 오른쪽에서 시작하여 일치하는 픽셀이있는 x 열을 칠 때까지 각 열을 확인해야합니다. 이 같은

뭔가 :

minY = getMinY(fastBitmap, indexToRemove); 
maxY = getMinY(fastBitmap, indexToRemove); 
minX = getMinY(fastBitmap, indexToRemove); 
maxX = getMinY(fastBitmap, indexToRemove); 

int getMinY(Bitmap bitmap, byte indexToRemove) 
{ 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      if (fastBitmap.GetPixel(x, y).B == indexToRemove) 
      { 
       return y; 
      } 
     } 
    } 
    return 0; 
} 

int getMaxY(Bitmap bitmap, byte indexToRemove) 
{ 
    for (int y = height; y > 0; y--) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      if (fastBitmap.GetPixel(x, y).B == indexToRemove) 
      { 
       return y; 
      } 
     } 
    } 
    return height; 
} 

등 ...

당신은 getMinX 및 getMaxY 직접 작성 할 수 있어야한다.

+0

건배. 내 뇌는 확실히 오프 모드였습니다. 그것은 쉬운 비트 였을 것입니다. –