• opencv中的洪水填充算法


      在图像处理里,如果我们需要填充一个区域,使该区域为相同的颜色,则比较常用的是洪水填充法。洪水填充法可以用DFS也可以用BFS实现。

      opencv下有函数实现该功能:

      

    CVAPI(void)  cvFloodFill( CvArr* image, CvPoint seed_point,
                              CvScalar new_val, CvScalar lo_diff CV_DEFAULT(cvScalarAll(0)),
                              CvScalar up_diff CV_DEFAULT(cvScalarAll(0)),
                              CvConnectedComp* comp CV_DEFAULT(NULL),
                              int flags CV_DEFAULT(4),
                              CvArr* mask CV_DEFAULT(NULL));
    image:表示被填充的图像
    seed_point:以哪个点为基点进行填充
    new_val:填充成什么颜色
    lo_diff ,up_diff:当邻近像素点在参考点(可以设置参考点为定点,也可以是动点)范围,(参考点 - lo_diff,参考点 + up_diff)
    comp:连通量的属性(暂时还没解释)
    flags: 分成三部分,0-7位可以设置4或8(4表示上下左右,8表示点周围八个点),8-15位设置指定填充掩码的值,16-23位可以CV_FLOODFILL_FIXED_RANGE或者CV_FLOODFILL_MASK_ONLY(可以同时使用),CV_FLOODFILL_FIXED_RANGE设置后表示当前点与种子像素点在一定范围内时才填充,否则当前点与相邻点比较, 如果设置CV_FLOODFILL_MASK_ONLY那么就在设置掩码的值
    mask:跟掩码有关,这里暂时不介绍

    测试代码:
    #include "stdafx.h"
    #include "cv.h"
    #include "highgui.h"
    
    int main(){
        IplImage *img= cvLoadImage("C:/CIR.jpg");//读取图片
        cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
    
        cvShowImage("Example1",img);//在Example1显示图片
        //    cvCopy(img,temp);
        IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图
            cvGetSize(img),
            IPL_DEPTH_8U,
            3
            );
        CvPoint ptemp;//种子像素点位置
        ptemp.x=100; 
        ptemp.y=100;
        CvScalar scalarTemp;
        scalarTemp.val[0]=0;//填充成黑色
        scalarTemp.val[1]=0;
        scalarTemp.val[2]=0;
    
        CvScalar scalarDis;
        scalarDis.val[0]=13;//范围
        scalarDis.val[1]=13;
        scalarDis.val[2]=13;
    
        cvCopy(img,temp);
        cvFloodFill(
            temp,
            ptemp,
            scalarTemp,
            scalarDis,
            scalarDis
            );
    
        cvShowImage("Example2",temp);
    
        cvWaitKey(0);//暂停用于显示图片
    
        cvReleaseImage(&img);//释放img所指向的内存空间并且
        cvDestroyWindow("Example1");
        cvDestroyWindow("Example2");
        return 0;
    }
    View Code

     效果图:

     

     
  • 相关阅读:
    使用 RMAN 同步数据库
    关于MongoDB分布式高可用集群实现
    Oracle排错总结
    Oracle中Restore和Recovery的区别
    linux下防火墙iptables原理及使用
    RHEL6.5上升级OpenSSH7.4p1
    awk中next以及getline用法示例
    Linux下Redis的安装和部署
    Mongodb集群搭建的三种方式
    天地图服务地址
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3532820.html
Copyright © 2020-2023  润新知