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

 效果图:

 

 
原文地址:https://www.cnblogs.com/huhuuu/p/3532820.html