带遮罩的OpenCV泛光填充
OpenCV的泛洪填充功能状态: 该函数使用并更新掩码,因此您负责 初始化掩码内容。洪水填充不能穿过非零水位 遮罩中的像素。例如,可以使用边缘检测器输出 作为遮罩,在边缘停止填充。可以使用相同的方法 屏蔽对函数的多次调用,以确保填充区域 不重叠带遮罩的OpenCV泛光填充,opencv,flood-fill,Opencv,Flood Fill,OpenCV的泛洪填充功能状态: 该函数使用并更新掩码,因此您负责 初始化掩码内容。洪水填充不能穿过非零水位 遮罩中的像素。例如,可以使用边缘检测器输出 作为遮罩,在边缘停止填充。可以使用相同的方法 屏蔽对函数的多次调用,以确保填充区域 不重叠 函数如何更新掩码?它是否将泛光填充中的所有像素设置为某个非零值?与遮罩种子点相同的连接组件中的所有零值像素都将替换为您指定的值。此值必须添加到标志参数中,左移8位: uchar fillValue = 128; cv::floodFill(img, ma
函数如何更新掩码?它是否将泛光填充中的所有像素设置为某个非零值?与遮罩种子点相同的连接组件中的所有零值像素都将替换为您指定的值。此值必须添加到
标志
参数中,左移8位:
uchar fillValue = 128;
cv::floodFill(img, mask, seed, cv::Scalar(255) ,0, cv::Scalar(), cv::Scalar(), 4 | cv::FLOODFILL_MASK_ONLY | (fillValue << 8));
此图像中的结果:
然后,创建遮罩并对其进行整体填充:
//Create a mask from edges in the original image
cv::Mat mask;
cv::Canny(img, mask, 100, 200);
cv::copyMakeBorder(mask, mask, 1, 1, 1, 1, cv::BORDER_REPLICATE);
//Fill mask with value 128
uchar fillValue = 128;
cv::floodFill(img, mask, seed, cv::Scalar(255) ,0, cv::Scalar(), cv::Scalar(), 4 | cv::FLOODFILL_MASK_ONLY | (fillValue << 8));
//从原始图像中的边创建遮罩
cv::Mat面罩;
cv::Canny(img,面罩,100200);
cv::copyMakeBorder(掩码,掩码,1,1,1,1,cv::BORDER\u REPLICATE);
//用值128填充掩码
uchar fillValue=128;
cv::floodFill(img、掩码、种子、cv::Scalar(255)、0、cv::Scalar()、cv::Scalar()、4 | cv::floodFill_mask_ONLY |(fillValue和python版本
im = cv2.imread("seagull.jpg")
h,w,chn = im.shape
seed = (w/2,h/2)
mask = np.zeros((h+2,w+2),np.uint8)
floodflags = 4
floodflags |= cv2.FLOODFILL_MASK_ONLY
floodflags |= (255 << 8)
num,im,mask,rect = cv2.floodFill(im, mask, seed, (255,0,0), (10,)*3, (10,)*3, floodflags)
cv2.imwrite("seagull_flood.png", mask)
im=cv2.imread(“seagull.jpg”)
h、 w,chn=im.shape
种子=(w/2,h/2)
掩码=np.0((h+2,w+2),np.uint8)
泛洪标志=4
泛光标志|=cv2。仅限泛光填充遮罩
floodflags |=(255根据Aurelius的回答,面具需要归零
检查来源中的评论,它指出
因为这既是一个输入参数也是一个输出参数,所以您必须承担责任
整体填充不能跨越输入掩码中的非零像素
遮罩会影响结果,因此需要在使用前调零:
cv::Mat mask;
mask = cv::Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);
有人能在java的答案中重写这段代码吗?@Aurelius谢谢你指出掩码的像素必须为零值才能被填充。这个提示拯救了我的一天……python用户提示:这与此完全相同,语法如下:flood\u value=128 cv.floodFill(img,mask,seed,255,5,5,flags=cv.FLOODFILL_mask_ONLY |)(flood_值需要注意的一件特别重要的事情是,当指定一个点时,与numpy索引相比,x
和y
轴是切换的。对于相同的图像和代码,我只得到边缘-你能告诉我为什么会出现这种情况吗?@aneeshaasc try(7,)*3,(7,)*3而不是cv2中的(10,)*3,(10,)*3。泛光填充(im,面具,种子,(255,0,0),(10,)*3,(10,)*3,泛光标志)标志的含义是什么255@Aelius有关完整说明,请参阅文档:
cv::Mat mask;
mask = cv::Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);