用c ++填充灰度图像中的孔

时间:2015-09-01 16:42:05

标签: c++ matlab opencv image-processing grayscale

我正在做一个c ++程序,作为我程序的一部分,我需要在GRAYSCALE图像上执行填充操作,类似于Matlab的imfill函数(http://www.mathworks.com/help/images/ref/imfill.html)。

我尝试在互联网上搜索c ++中的示例代码,这样做并使用OpenCV库,但我只找到了与Matlab对BINARY图像(Fill the holes in OpenCVFilling holes inside a binary object的imfill相同的代码。

无论如何只使用OpenCV对GRAYSCALE图像执行类似imfill的操作吗?如果没有,是否有其他开源库我可以用c ++来填充灰度图像中的漏洞而不知道种子?

1 个答案:

答案 0 :(得分:0)

请参阅@MSalters评论以获取正确答案。

您需要一些逻辑或标准来确定哪些像素被视为孔,哪些像素不是。这用于生成二进制图像(其中' 0'是非空洞像素的值,' 255'(在Matlab世界中为1)是孔像素的值)可以是用来填补每个洞。然后简单地将阈值图像添加到那么基本上总是是二进制图像来决定填充孔的位置,从恰好是源的灰度图像派生。

C ++中的一个例子:

    Mat GrayImage; // INPUT grayscale image
    Mat ThresholdImage; // binary mask image
    Mat DrawImage; // OUTPUT filled image
    GrayImage.copyTo(DrawImage);

    // create a mask where to fill
    int thresh = 90;
    cv::threshold(GrayImage, ThresholdImage, thresh, 255, cv::ThresholdTypes::THRESH_BINARY);

    int fillvalue = 120;
    bitwise_and(GrayImage, Scalar(0), DrawImage, ThresholdImage);
    bitwise_or(DrawImage, Scalar(fillvalue), DrawImage, ThresholdImage);
    // BONUS logically equivalent operation of the above two lines
    //bitwise_or(GrayImage, Scalar(255), DrawImage, ThresholdImage);
    //bitwise_and(DrawImage, Scalar(fillvalue), DrawImage, ThresholdImage);

    imshow("grayimage", GrayImage);
    imshow("thresholdimage", ThresholdImage);
    imshow("drawimage", DrawImage);

有关实施标准以确定漏洞的各种方法,请参阅以下链接。

Reference 1

Reference 2

OpenCV Documentation