如何以编程方式检测图像边框?

时间:2009-12-23 19:10:00

标签: automation

我正在搜索检测图像边框的程序, 例如,我有一个正方形,程序检测到X / Y-Coords

示例:

alt text http://img709.imageshack.us/img709/1341/22444641.png

5 个答案:

答案 0 :(得分:5)

这是一个非常简单的边缘检测器。它适用于二进制图像。它只计算水平和垂直像素之间的差异,如image.pos [1,1] = image.pos [1,1] - image.pos [1,2]和垂直差异相同。请记住,您还需要在值0..255。

的范围内对其进行标准化

但是!如果您只需要一个程序,请使用Adobe Photoshop。

用C#编写的代码。

public void SimpleEdgeDetection()
{
    BitmapData data = Util.SetImageToProcess(image);
    if (image.PixelFormat != PixelFormat.Format8bppIndexed)
        return;

    unsafe
    {
        byte* ptr1 = (byte *)data.Scan0;
        byte* ptr2;
        int offset = data.Stride - data.Width;
        int height = data.Height - 1;
        int px;

        for (int y = 0; y < height; y++)
        {
            ptr2 = (byte*)ptr1 + data.Stride;
            for (int x = 0; x < data.Width; x++, ptr1++, ptr2++)
            {
                px = Math.Abs(ptr1[0] - ptr1[1]) + Math.Abs(ptr1[0] - ptr2[0]);
                if (px > Util.MaxGrayLevel) px = Util.MaxGrayLevel;
                ptr1[0] = (byte)px;
            }
            ptr1 += offset;
        }
    }
    image.UnlockBits(data);
}

Util类的方法

static public BitmapData SetImageToProcess(Bitmap image)
{
    if (image != null)
        return image.LockBits(
            new Rectangle(0, 0, image.Width, image.Height),
            ImageLockMode.ReadWrite,
            image.PixelFormat);

    return null;
}

如果您需要更多解释或算法,只需询问更多信息,而不要如此笼统。

答案 1 :(得分:4)

您可以使用任何图像处理库,例如Opencv。这是在c ++或python中。 您应该寻找边缘检测功能,例如Canny边缘检测。 当然,这需要一些潜入图像处理。 您提供的示例图像应该直接检测,图像的噪声/变化有多大?

答案 2 :(得分:3)

这取决于您想要对边框执行的操作,如果您只想获取区域边缘的值,请使用名为Connected Components Region的算法。在使用算法之前,您必须知道该区域的值。这将在边界周围导航并收集外部区域。如果您试图仅检测外线,则获得图像的渐变,它将显示线条的位置。为此,使用边缘检测滤波器(如Prewitt,Sobel等)对图像进行卷积

答案 3 :(得分:1)

shape recognition algorithm可能会帮助你,只要它有某种实心边框,背景颜色是实心的。

答案 4 :(得分:0)

从它的声音中,你只需要一个blob extraction algorithm。之后,x / y的最低/最高值将为您提供角点的坐标。