C# 计算二值图像上的边界矩形

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

我尝试使用以下方法获得二值图像中感兴趣的边的边界。可悲的是,我的数学似乎让我失望,我只得到了一个矩形,每个维度比原始图像小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);
}
私有矩形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。

干杯。我的大脑肯定处于关闭状态。这应该是容易的一点。