emguCV - 快速计算二进制图像中带孔的对象区域

时间:2017-03-10 20:59:55

标签: c# opencv image-processing computer-vision emgucv

在我的应用程序中,我在线处理图像(1920x400),帧速率高达350 fps。从这些图像中,我连续计算出位于图像中间的黑色物体的区域。物体通常有很少的白洞。

Example for you to get an idea of images

Example for you to get an idea of images

用于计算当前在阈值(B / W)图像上使用emguCV函数CvInvoke.CountNonZero(Mat)的区域I&m。这个解决方案运行得很好,但我的问题是漏洞,这可能会错误地显示结果。

我试图使用形态侵蚀来填补空洞

if (erodeEnable)
{
    Mat kernel = new Mat(5, 5, DepthType.Cv8U, 1);
    kernel.SetTo(new MCvScalar(1));
    CvInvoke.Erode(postProcessTempMat, postProcessTempMat, new Mat(5, 5, DepthType.Cv8U, 1), new System.Drawing.Point(0,0), erodeIterations, BorderType.Default, new MCvScalar(0, 0, 0));
}

但是此操作会显着改变对象形状。我想填补这些洞,但如果不改变则保持外形。

我也尝试使用我自己的方法,逐列搜索第一个上下黑色像素,并从这些像素的位置计算外形的面积。

public int getBlackArea(Mat matImage)
{
    Image<Gray, Byte> tempImg = matImage.ToImage<Gray, Byte>();

    int result = 0;
    int coll = 0;
    int upperBorder, lowerBorder;
    const int avFactor = 3;

    result = 0;
    for (coll = 0; coll < tempImg.Width; coll=coll+avFactor)
    {
        lowerBorder = 0;
        while ((tempImg.Data[lowerBorder,coll, 0] > 0) && (lowerBorder < tempImg.Height))
        {
            lowerBorder++;
        }
        upperBorder = iMAGEhEIGHT - 1;
        while ((tempImg.Data[upperBorder,coll, 0] > 0) && (upperBorder > 0))
        {
            upperBorder--;
        }
        result += ((upperBorder - lowerBorder) * avFactor);
        //tempImg.Data[(upperBorder-5), coll, 0] = 120;      // draw the outline for check of function
        //tempImg.Data[(lowerBorder+5), coll, 0] = 120;      // draw the outline for check of function
    }
    //tempImg.Save(@"C:\\pics\INFOoutlined.jpg");
    return result;
}

这种方法可以获得非常好的结果,但是时间要求太高了。

你有什么想法,如何提高我的功能以加快速度?或者你没有任何其他想法,我怎么能达到结果呢?

非常感谢提前:)

1 个答案:

答案 0 :(得分:1)

这完全取决于您选择执行的形态学操作。

我首先通过选择最佳阈值来对图像进行二值化。

然后我进行了形态开放。与 yvs 不同,形态关闭根本不会改变图像。由于要填充的孔被黑色像素包围,形态开放解决了这个问题。

然而,如果孔被白色像素包围,形态 close 就可以了。

<强>输出

图片1:

阈值:

enter image description here

形态开放:

enter image description here

图片2:

阈值:

enter image description here

形态开放:

enter image description here

如您所见,在两种情况下都填充了孔。