區域生長(floodFill)

區域生長是將像素,或是子區域合併成更大區域的過程,基本上是從一組生長點開始,生長點可以是單個像素,也可以是某個小區域,把和生長點性質相似的相鄰像素或是區域合併,成為一個新的生長點,重複此過程直到不能生長為止,生長點和相鄰區域的相似性判斷,可以依據強度、顏色、紋理等多種影像訊息,OpenCV提供floodFill()函式進行區域生長,用顏色來進行相似性判斷,可選擇是否輸入遮罩,區域生長只發生在遮罩指定的像素點。

區域生長通常有以下步驟:

  1. 選擇合適的生長點,可由程式判定或使用者輸入。
  2. 確定相似性判斷標準,只要符合標準就持續生長。
  3. 確定生長停止條件,只要符合就停止生長,一般來說,只要區域內沒有像素符合相似性判斷標準,區域生長就會停止。

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