1. 程式人生 > >opencv 漫水填充

opencv 漫水填充

一、話說漫水填充

漫水填充是一種用特定的顏色填充連通區域,通過設定可連通畫素的上下限以及連通方式達到不同的填充效果的方法。漫水填充經常用來標記或者是分離影象的一部分,以便對其進行進一步處理貨分析,也可以用來從輸入影象獲取掩碼區域,掩碼會加速處理過程,或者只處理指定的畫素點,操作的結果總是某個連續的區域。他的基本作用有兩個:1、標記或分離目標區域;2、獲取掩碼區域,只處理掩碼指定的畫素點,加速處理過程。二、兩個不同的版本

1.不帶mask版f

loodFill(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 必須是非空的).

2.帶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);
三、實驗
int main()
{
	Mat src;
	src = imread("D:\\cv_study\\Exercise\\water-flood\\1.png");
	Rect rect;
	Mat dst = src.clone();
	floodFill(dst, Point(131, 93), Scalar(255, 0, 0), &rect, Scalar(10, 10, 10), Scalar(50, 50, 50));
	waitKey();
    return 1;
}
int main()
{
	Mat src;
	src = imread("D:\\cv_study\\Exercise\\water-flood\\1.png");
	Rect rect;
	Mat dst = src.clone();
	Mat dst1 = src.clone();
	Mat mask = Mat::zeros(src.rows + 2, src.cols + 2, CV_8UC1);
	floodFill(dst, Point(131, 93), Scalar(255, 0, 0), &rect, Scalar(10, 10, 10), Scalar(50, 50, 50));
	floodFill(dst1, mask, Point(50,50), Scalar(0, 255, 0), &rect, Scalar(10, 10, 10), Scalar(50, 50, 50));
	waitKey();
    return 1;



好了,以上就是今天的內容,比較簡單,希望更多的小夥伴一起學習,探討。