在opencv中,實現了grabcut分割演算法,該演算法可以方便的分割出前景影象,操作簡單,而且分割的效果很好。演算法的原理參見papaer:「grabcut」 — interactive foreground extraction using iterated graph cuts
比如下面的一副圖,我們只要選定乙個四邊形框,把框中的影象作為grabcut的乙個輸入引數,表示該框中的畫素可能屬於前景,但框外的部分一定屬於背景。
grabcut演算法實現步驟為:
1.在中定義含有(乙個或多個)物體的矩形
2.矩形外的區域被自動認為是背景
3.對於使用者定義的矩形區域,可用背景中的資料來區別它裡面的前景和背景區域
4.用高斯混合模型(gmm)來對背景和前景建模,並將未定義的畫素標記為可能的前景或背景。
5.影象中的每乙個畫素都被看作通過虛擬邊與周圍畫素相連線,而每條邊都有乙個屬於前景或背景的概率,這基於它與周圍畫素顏色上的相似性。
6.每乙個畫素(即演算法中的節點)會與乙個前景或背景節點連線
7.在節點完成連線後(可能與背景或前景連線),若節點之間的邊屬於不同終端(即乙個節點屬於前景,另乙個節點屬於背景),則會切斷它們之間的邊(這就是演算法名中的切割部分),這就能將影象各部分分割出來。
],np.uint8)#建立乙個掩模
#建立以0填充的前景和背景模型bgdmodel=np.zeros((1,65
),np.float64)
fgdmodel=np.zeros((1,65
),np.float64)
rect=(100,160,400,670
)#建立矩形
cv2.grabcut(img,mask,rect,bgdmodel,fgdmodel,
5,cv2.gc_init_with_rect)#使用了指定的空模型和掩模來執行grabcut,並且實際上是用乙個矩形來初始化這個操作
#做完這些後,我們的掩模已經變成包含0~3之間的值。值為0和2的將轉為0,值為1,3的將轉為1.然後儲存在mask2中。這樣就可以用mask2過濾出所有的0值畫素(理論上會完整保留所有前景畫素)
把影象中的低密度的區域(變化很少)想象成山谷,影象中高密度的區域(變化很多)想象成山峰。開始向山谷中注入水直到不同的山谷中的水開始匯聚。為了阻止不同山谷的水匯聚,可以設定一些柵欄,最後得到的柵欄就是影象分割。
gray=cv2.cvtcolor(img,cv2.color_bgr2gray)#顏色轉為灰度
ret,thresh=cv2.threshold(gray,0,255,cv2.thresh_binary_inv+cv2.thresh_otsu)#可為影象設乙個閾值
kernel=np.ones((3,3
),np.uint8)
opening=cv2.morphologyex(thresh,cv2.morph_open,kernel,iterations=2
)#去除雜訊
sure_bg=cv2.dilate(opening,kernel,iterations=3
)dist_transform=cv2.distancetransform(opening,cv2.dist_l2,5
)#可以通過distancetransform來獲取確定的前景區域。也就是說,這是影象中最可能是前景的區域,越是遠離背景區域的邊界點越可能屬於前景,這裡用了閾值來決定那些區域是前景
ret,sure_fg=cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0
)#這個階段之後,所得到的前景和背景中有重合的部分該怎麼辦?首先需要確定這些區域,這可從sure_bg與sure_fg的集合相減得到
sure_fg=np.uint8(sure_fg)
unknown=cv2.subtract(sure_bg,sure_fg)
#現在有了這些區域,就可以設定柵欄來阻止水匯聚,這是通過connectedcomponents函式完成。
ret,markers=cv2.connectedcomponents(sure_fg)
markers=markers+1
markers[unknown==255]=0
#把柵欄繪製成紅色
markers=cv2.watershed(img,markers)
img[markers==-1]=[255,0,0
]plt.imshow(img)
plt.show()
OpenCV3計算機視覺 python 二
當前,在計算機視覺中有三種常用的色彩空間 灰度 bgr以及hsv 1.灰度色彩空間是通過去除彩色資訊來將其轉換為灰階,灰度色彩空間對中間處理特別有效,比如人臉檢測 2.bgr,即藍綠紅色彩空間,每乙個畫素點都由乙個三元組來表示 3.hsv,h hue 是色調,s saturation 是飽和度,v ...
OpenCV 3計算機視覺(Canny邊緣檢測)
函式原型 edge cv2.canny image,threshold1,threshold2 edges aperturesize l2gradient 第乙個引數是待處理的原影象該函式會將影象處理成黑白,第二個引數是閾值1,第三個引數是閾值三 例如影象調整中的閾值就像一把尺子,它讓高於這把尺子的...
opencv3計算機視覺學習筆記 詞袋 svm
以sift 128維特徵作為例子。例如現在有1000張訓練,對每一張訓練都提取sift的128維特徵,那麼最終可以得到n i 128的特徵,n i 代表第i張圖特徵點的個數,因為每張影象不一樣,所以每張影象的sift 特徵個數也不一樣。提取特徵後對1000張影象提取出的所有sift特徵進行聚類 目的...