zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    站立会议 第十天
    站立会议 第十天
    找水王
    购买《哈利波特》书籍
    站立会议第三天
    站立会议第二天
    冲刺会议第一天
    补发《超级迷宫》站立会议五
    补发《超级迷宫》站立会议四
    课堂练习之求1到N之间的数里面含有1的个数
  • 原文地址:https://www.cnblogs.com/liming19680104/p/15773021.html
Copyright © 2011-2022 走看看