2014-09-25 61 views
0

我正試圖使用​​以下方法獲取二進制圖像中感興趣的邊緣的邊界。可悲的是,我的數學似乎讓我失望了,而且我只在每個維度上得到比原始圖像小2px的矩形。計算二進制圖像上的邊界矩形

有人可以告訴我我出錯的地方嗎?

。 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

乾杯。我的大腦絕對處於關閉狀態。這應該是容易的一點。 – 2014-09-26 16:40:26