1. 程式人生 > >0041-在OpenCV環境下做FloolFill分割

0041-在OpenCV環境下做FloolFill分割

關於FloolFill分割的原理,請大家參見我之前在CSDN部落格上寫的一篇文章,連結是:
http://blog.csdn.net/wenhao_ir/article/details/51967181

OpenCV提供了floodFill函式用來實現FloodFill泛洪填充演算法,下面詳細介紹這個函式。
原型如下:
C++: int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
C++: int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
引數意義如下:


image:輸入/輸出影象,型別可以是1通道或3通道,8位,浮點型的影象。在第二種形式中,當標誌FLOODFILL_MASK_ONLY被設定時,image會被修改。
mask:操作掩碼影象,型別要求是單通道的8點陣圖像。這個影象比image寬兩個象素,高兩個象素,原因是這個引數既是輸入引數,也是輸出引數,所以初始化時要留有餘地以確保演算法能進行,具體為什麼要這樣餘地,大家需要去查這個演算法實現的原理。
seedPoint:種子點。
newVal:填充顏色值。
rect:可選輸出引數,重繪區域的最小邊界。
loDiff:演算法實現所需區間中的較小值。這個區間所限定的是當前觀察象素與其同一組件的鄰域之前的差值,或者是當前觀察象素與同屬於這個元件的種子象素值之間的差值。
upDiff
:演算法實現所需區間中的較大值。這個區間所限定的是當前觀察象素與其同一組件的鄰域之前的差值,或者是當前觀察象素與同屬於這個元件的種子象素值之間的差值。
flags:函式運算控制標誌。
  前8位(即第0位到第7位)表示連線程度值,預設的4表示鄰域的四個點參與運算,而值8則表示鄰域的八個點參與運算。
  接下來的8位(即第8位到16位)表示mask的填充值。
  FLOODFILL_FIXED_RANGE:如果這個被設定,則表示引數loDiff和upDiff有效。
 FLOODFILL_MASK_ONLY :介紹image引數時已經說了這個標誌的作用,當它被設定時,原影象不會被改變,此時只填充mask影象。

示例程式碼如下:
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

執行結果如下圖所示

從結果中可以看出,背景區域被分割出來並被填充為藍色了。