漫水填充:將與種子點相連的像素相近的連通域替換成指定顏色。如果存在mask,不會填充mask的非零像素。比如邊緣檢測輸出圖像可作為mask圖
作用:1、標記或分離目標區域;
2、獲取掩碼區域,只處理掩碼指定的像素點,加速處理過程。
【第一個版本】
floodFill(InputOutputArray image,1/3通道8位或浮點圖像
Point seedPoint,種子點,起始點
Scalar newVal,指定顏色
Rect* rect=0,設定重繪區域的最小邊界矩形
Scalar loDiff=Scalar(),當前觀察象素值與其部件領域象素或者待加入該部件的種子象素之負差(Lower difference)的最大值。低於這個差距的不屬於重繪區域
Scalar upDiff=Scalar(),當前觀察象素值與其部件領域象素或者待加入該部件的種子象素之正差(upper difference)的最大值。高於這個差距的不屬於重繪區域
int flags=4);
對於單通道圖、8位圖,flag可取4鄰域(默認)或8鄰域
對於高於8位的圖,flag可以取0或下面的開關選項的組合:
FLOODFILL_FIXED_RANGE - 如果設置,則考慮當前像素與種子像素之間的差,否則考慮當前像素與其相鄰像素的差。(范圍是浮點數).
FLOODFILL_MASK_ONLY - 如果設置,函數不填充原始圖像(忽略newVal), 只填充掩模圖像 (這種情況下 MASK 必須是非空的).
【第二個版本】
floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4);
flags組合可以用“|”或符號
8|FLOODFILL_FIXED_RANGE|FLOODFILL_MASK_ONLY|(38<<8)
意思是8鄰域填充固定范圍的掩模圖像,填充值為38. 38<<8意思是38左移8位
Mask圖長和寬上都比輸入圖像 image 大兩個象素點
Mat mask; mask.create(src.rows + 2, src.cols + 2, CV_8UC1);初始化掩模mask mask = Scalar::all(0);//所有像素為0 imshow("mask",mask);
【實例】
Mat src = imread("C:/Users/a/Desktop/2.jpg"); imshow("原圖",src); Rect ccomp; floodFill(src,Point(100, 50), Scalar(0, 0, 0), &ccomp, Scalar(10, 10, 10), Scalar(50, 50, 50)); imshow("效果圖",src); waitKey(0); return 0;