计算二进制图像上的边界矩形

时间:2014-09-25 22:32:21

标签: c# image-processing bitmap

我尝试使用以下方法获取二进制图像中感兴趣边缘的边界。可悲的是,我的数学似乎让我失望了,而且我在每个维度上只得到比原始图像小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 个答案:

答案 0 :(得分: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。