在图像处理里,如果我们需要填充一个区域,使该区域为相同的颜色,则比较常用的是洪水填充法。洪水填充法可以用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; }
效果图: