opencv-floodfill漫水填充
函数作用:
用给定的颜色填充一个连通区域
实例:
3.jpg
#include<opencv2/opencv.hpp> #include<iostream> int main(int argc, char** argv) { cv::Mat src = cv::imread("D:/bb/tu/3.jpg"); cv::Mat src1 = src.clone(); imshow("原始图", src); cv::Rect ccomp; floodFill(src, cv::Point(50, 100), cv::Scalar(255, 0, 0), &ccomp, cv::Scalar(10, 10, 10), cv::Scalar(10, 10, 10));//漫水填充--不带掩膜版本 /* 第一个参数:InputOutputArray类型的image, 输入/输出1通道或3通道,8位或浮点图像,具体参数由之后的参数具体指明 第二个参数:Point类型,漫水填充算法的起始点 第三个参数:Scalar类型,像素点被染色的值,即在重绘区域像素的新值 第四个参数:Rect*类型-可选输出参数,有默认值0,一个可选的参数,用于设置floodFill函数将要重绘区域的最小边界矩形区域 第五个参数:当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大下行差异值,有默认值Scalar( ) 【与参数2点 像素颜色的差异下行值】 第六个参数:当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大上行差异值,有默认值Scalar( ) 【与参数2点 像素颜色的差异上行值】 第七个参数:flags操作标志符 (1)低八位(第0~7位),用于控制算法的连通性,可取4(默认值)或者8。如果设为4,表示填充算法只考虑当前像素水平 方向和垂直方向的相邻点。如果设为8,除上述相邻点外,还会包含对角线方向的相邻点。 (2)高八位部分(16~23位),可以为0或者如下两种选项标识符的组合 FLOODFILL_FIXED_RANGE - 如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相 邻像素的差。也就是说,这个范围是浮动的。 FLOODFILL_MASK_ONLY - 如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数newVal), 而是 只使用flags标志中bit8-15的值去填充掩模图像(mask)。这个标识符只对第二个版本的floodFill有用,因第一个版本里面 压根就没有mask参数。 (3)中间八位部分,上面关于高八位FLOODFILL_MASK_ONLY标识符中已经说的很明显,需要输入符合要求的掩码。 Floodfill的flags参数的中间八位的值就是用于指定填充掩码图像的值的。但如果flags中间八位的值为0,则掩码会用1来填充 */ imshow("不带掩膜", src); cv::Mat mask(src.rows + 2, src.cols + 2, CV_8UC1, cv::Scalar(0)); //掩膜 for (int row = 0; row < 50;row++) { for (int col = 0; col < 100;col++) { mask.at<uchar>(row, col) = 100; } } floodFill(src1,mask, cv::Point(50, 100), cv::Scalar(255, 0, 0), &ccomp, cv::Scalar(10, 10, 10), cv::Scalar(10, 10, 10));//漫水填充--带掩膜版本 /*第二个参数,mask表示操作掩膜,为单通道8位,长宽都比输入图像大两个像素点的图像。 漫水填充不会填充掩膜mask的非零像素区域,mask中与输入图像(x,y)像素点相对应的点的坐标为(x+1,y+1) */ imshow("带掩膜", src1); cv::waitKey(0); return 0; }