
如圖所示,這是通過邊緣檢測得到的物體邊沿結(jié)果,而我們的目標(biāo)是將圖中的類似橢圓區(qū)域分割出來。這里就可以用到漫水填充法,函數(shù)cv2.floodFill()。
漫水填充法是一種用特定的顏色填充聯(lián)通區(qū)域,通過設(shè)置可連通像素的上下限以及連通方式來達到不同的填充效果的方法。漫水填充經(jīng)常被用來標(biāo)記或分離圖像的一部分以便對其進行進一步處理或分析,也可以用來從輸入圖像獲取掩碼區(qū)域,掩碼會加速處理過程,或只處理掩碼指定的像素點,操作的結(jié)果總是某個連續(xù)的區(qū)域。
import cv2
import numpy as np
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))#腐蝕膨脹的算子
image = np.ones((100, 100), np.uint8)*255
edges = np.zeros((102,102),np.uint8)#掩碼,長短需要加2個像素
edges_1[0:100,0:100] = edges
cv2.floodFill(image, edges_1, (0, 0), 0, cv2.FLOODFILL_MASK_ONLY)#漫水填充
mask = cv2.erode(image, kernel)#腐蝕
mask = cv2.dilate(mask , kernel)#膨脹

floodFill( 1.操作圖像, 2.掩模, 3.起始點,4.填充的顏色, 5.填充顏色的低值,6.填充顏色的高值 ,7.填充方法)
1:輸入圖像,可以是一通道或者是三通道。
2:該版本特有的掩膜。 單通道,8位,在長寬上都比原圖像image多2個像素點。另外,當(dāng)flag為FLOORFILL_MAK_ONLY時,只會填充mask中數(shù)值為0的區(qū)域。
3:漫水填充的種子點,即起始點。
4:被填充的像素點新的像素值
5:表示當(dāng)前的觀察點像素值與其相鄰區(qū)域像素值或待加入該區(qū)域的像素之間的亮度或顏色之間負差的最大值。
6:表示當(dāng)前的觀察點像素值與其相鄰區(qū)域像素值或待加入該區(qū)域的像素之間的亮度或顏色之間負差的最小值。
7:
當(dāng)為CV_FLOODFILL_FIXED_RANGE 時,待處理的像素點與種子點作比較,在范圍之內(nèi),則填充此像素 。(改變圖像)
CV_FLOODFILL_MASK_ONLY 此位設(shè)置填充的對像, 若設(shè)置此位,則mask不能為空,此時,函數(shù)不填充原始圖像img,而是填充掩碼圖像.