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