opencv3計算機視覺 Python(四)

2022-07-30 10:21:11 字數 2959 閱讀 1623

在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特徵進行聚類 目的...