opencvfloodfill漫水填充

函数作用:

  用给定的颜色填充一个连通区域 

实例:

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;
}

原文地址:https://www.cnblogs.com/liming19680104/p/15773021.html