區域生長是將像素,或是子區域合併成更大區域的過程,基本上是從一組生長點開始,生長點可以是單個像素,也可以是某個小區域,把和生長點性質相似的相鄰像素或是區域合併,成為一個新的生長點,重複此過程直到不能生長為止,生長點和相鄰區域的相似性判斷,可以依據強度、顏色、紋理等多種影像訊息,OpenCV提供floodFill()函式進行區域生長,用顏色來進行相似性判斷,可選擇是否輸入遮罩,區域生長只發生在遮罩指定的像素點。
區域生長通常有以下步驟:
- 選擇合適的生長點,可由程式判定或使用者輸入。
- 確定相似性判斷標準,只要符合標準就持續生長。
- 確定生長停止條件,只要符合就停止生長,一般來說,只要區域內沒有像素符合相似性判斷標準,區域生長就會停止。
OpenCV區域生長
int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4)
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位元圖或浮點數圖,除非使用有遮罩的函式,且flag為FLOODFILL_MASK_ONLY,否則呼叫函式後image會變更。
- mask:遮罩圖,必須單通道8位元,且尺寸較image寬和長2個像素,區域生長不會跨越非零像素,所以可用邊緣後當作區域生長的邊界,要注意由於mask比image大,所以image的(x,y)相對於mask的(x+1,y+1)。
- LseedPoint:一開始的生長點。
- newVal:重新設定的像素值(同個區域同個值)。
- loDiff:往下的最大差異值,只要生長點周圍的像素值,強度或者顏色差異小於此值,就合併成同個區域。
- upDiff:往上的最大差異值,只要生長點周圍的像素值,強度或者顏色差異小於此值,就合併成同個區域
- rect:選擇性輸入,最小的矩形重繪區域。
- flags:選擇性旗標,有分低、中、高八位可選擇。
flags:
- 低八位:選擇為4或8通道連通。
- 中八位:當我們高八位選擇為FLOODFILL_MASK_ONLY時,這邊為填充mask的值,如果為0的話,則用1來填充mask。
-
高八位:可不選、選以下兩者之一或兩者皆選:
a、FLOODFILL_FIXED_RANGE:如果設定此旗標,表示合併時考慮當前像素和種子像素的差(差值固定),否則合併時考慮當前像素和周圍像素(差值浮動)。
b、FLOODFILL_MASK_ONLY:如果設定了此旗標,改變mask,不改變image,忽略參數newVal,由flag中八位的值,決定填充mask的值。
可用以下方式設定flag參數:
flags = 8 | FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE