【发布时间】:2014-07-09 22:54:06
【问题描述】:
我有以下图片:
我正在尝试创建一个循环,该循环将考虑每个像素的颜色,并从它找到的任何白点进行填充。
目前,我有这个代码:
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;
}
}
}
如您所见,它在每个像素上循环,如果它是白色的,它会从那里泛滥填充。我还在循环中留下了一些旧代码,这些代码对每个单独的像素重新着色并正常工作,但是当我尝试用泛洪填充我的图像时,它给我留下了这样的东西:
它最终会淹没图像超过 4000 次,这需要很长时间,甚至没有填满整个区域。
任何想法我做错了什么?或者有更好的方法吗?
【问题讨论】:
-
你不应该有 int 填充 = cv::floodFill(image, cv::Point(x,y), 255, (cv::Rect*)0, cv::Scalar() , 200);而不是 int 填充 = cv::floodFill(image, cv::Point(0,0), 255, (cv::Rect*)0, cv::Scalar(), 200);?因为现在即使你迭代每个像素,但你从 (0,0) 开始填充...
-
请注意,循环中的第一行没有做任何事情。我猜你想将它存储在一个变量中以便在
if条件下更容易地访问它? -
我知道这是一篇旧帖子,但正如我所见,您正在使用白色进行填充,并在重复之前检查当前像素是否(仍然)是白色?
标签: c++ opencv image-processing flood-fill