OpenCV:使用循环查找白色像素并填充它们

时间:2014-07-09 14:25:14

标签: c++ opencv image-processing flood-fill

我有以下图片:

nine

我正在尝试创建一个循环,该循环将考虑每个像素的颜色,并从它找到的任何白点填充填充。

目前,我有这段代码:

        for(int y=0; y<image.rows; y++)
    {
        for(int x=0; x<image.cols; x++)
        {
            image.at<cv::Vec3b>(y,x);

            if(image.at<cv::Vec3b>(y,x)[0] == 255 && image.at<cv::Vec3b>(y,x)[1] == 255 && image.at<cv::Vec3b>(y,x)[2] == 255)
            {   
                /*image.at<cv::Vec3b>(y,x)[0] = 155;
                image.at<cv::Vec3b>(y,x)[1] = 0;
                image.at<cv::Vec3b>(y,x)[2] = 0;*/

                int filling = cv::floodFill(image, cv::Point(y,x), 255, (cv::Rect*)0, cv::Scalar(), 200);

                //cout << "x:" << x << " y:" << y;
            }

        }
    } 

正如你所看到的,它在每个像素上循环,如果它是白色的,它就会从那里溢出。我还在循环中留下了一些旧的代码,它们重新处理每个像素并且工作,但是当我尝试填充我的图像时,它给我留下了类似的东西:

ninefail

最终洪水填充图像超过4000次,这需要很长时间,甚至不会填满整个区域。

任何想法我做错了什么?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您的问题是您总是从(0,0)填充填充,而不是从(x,y)处找到的白色像素填充。同样使用`at&lt;&gt;()是顺序扫描图像的一种非常慢的方式。

更正后的代码:

cv::Vec3b white(255, 255, 255);

for(int y=0; y<image.rows; y++)
{
    cv::Vec3b* row = image.ptr<cv::Vec3b>(y)
    for(int x=0; x<image.cols; x++)
    {

        if(row[x] == white)
        {   
            cv::floodFill(image, cv::Point(x,y), cv::Scalar(255,0,0), (cv::Rect*)0, cv::Scalar(), cv::Scalar(200,200,200));
        }

    }
}