在圖像處理里,如果我們需要填充一個區域,使該區域為相同的顏色,則比較常用的是洪水填充法。洪水填充法可以用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; }
效果圖: