C# 计算二值图像上的边界矩形
我尝试使用以下方法获得二值图像中感兴趣的边的边界。可悲的是,我的数学似乎让我失望,我只得到了一个矩形,每个维度比原始图像小2倍 有人能告诉我哪里出了问题吗 注意。FastBitmap是一个允许快速访问像素数据的类C# 计算二值图像上的边界矩形,c#,image-processing,bitmap,C#,Image Processing,Bitmap,我尝试使用以下方法获得二值图像中感兴趣的边的边界。可悲的是,我的数学似乎让我失望,我只得到了一个矩形,每个维度比原始图像小2倍 有人能告诉我哪里出了问题吗 注意。FastBitmap是一个允许快速访问像素数据的类 private Rectangle FindBox(Bitmap bitmap, byte indexToRemove) { int width = bitmap.Width; int height = bitmap.Height; int minX = wid
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);
}
私有矩形FindBox(位图、字节索引或移动)
{
int width=位图宽度;
int-height=位图.height;
int minX=宽度;
int minY=高度;
int max=0;
int-maxY=0;
使用(快速位图快速位图=新的快速位图(位图))
{
对于(int y=0;ymaxX)
{
maxX=x;
}
if(ymaxY)
{
maxY=y;
}
}
}
}
}
//检查
如果((minX==宽度)&&(minY==高度)&&&(maxX==0)&(maxY==0))
{
minX=minY=0;
}
返回新矩形(minX,minY,maxX-minX+1,maxY-minY+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;
}
minY=getMinY(快速位图,索引移动);
maxY=getMinY(快速位图,indexToRemove);
minX=getMinY(快速位图,indexToRemove);
maxX=getMinY(快速位图,indexToRemove);
int getMinY(位图、字节索引或移动)
{
对于(int y=0;y0;y--)
{
对于(int x=0;x
等等
您应该能够自己编写getMinX和getMaxY。干杯。我的大脑肯定处于关闭状态。这应该是容易的一点。