當前位置:首頁 » 操作系統 » 輪廓圖演算法

輪廓圖演算法

發布時間: 2023-07-12 12:13:58

1. 如何用python取圖片輪廓

1、查找輪廓(find_contours)

measure模塊中的find_contours()函數,可用來檢測二值圖像的邊緣慧游輪廓。

函數原型為:

skimage.measure.find_contours(array,level)

array: 一個二值數組圖像

level: 在圖像中查找輪廓的級別值

返回輪廓列表集合,可用for循環取出每一條輪廓。

例1:

importnumpyasnp
importmatplotlib.pyplotasplt
fromskimageimportmeasure,draw

#生成二值測試圖像
img=np.zeros([100,100])
img[20:40,60:80]=1#矩形
rr,cc=draw.circle(60,60,10)#小圓
rr1,cc1=draw.circle(20,30,15)#大圓
img[rr,cc]=1
img[rr1,cc1]=1

#檢測所有圖形的輪廓
contours=measure.find_contours(img,0.5)

#繪制輪廓前陵銷
fig,(ax0,ax1)=plt.subplots(1,2,figsize=(8,8))
ax0.imshow(img,plt.cm.gray)
ax1.imshow(img,plt.cm.gray)
forn,contour汪則inenumerate(contours):
ax1.plot(contour[:,1],contour[:,0],linewidth=2)
ax1.axis('image')
ax1.set_xticks([])
ax1.set_yticks([])
plt.show()

結果如下:不同的輪廓用不同的顏色顯示

2. OpenCV-Python教程:19.輪廓屬性

1圖像矩

幫你計算一些屬性,比如重心,面積等。

函數cv2.moments()會給你一個字典,包含所有矩值

你可以從這個裡面得到有用的數據比如面積,重心等。重心可以用下面的式子得到:

2.輪廓面積

輪廓面積由函數cv2.contourArea()得到或者從矩里得到M['m00']

3.輪廓周長

可以用cv2.arcLength()函數得到。第二個參數指定形狀是否是閉合的輪廓(如果傳True)。或者只是一個曲線。

4.輪廓近似

這會把輪廓形狀近似成別的邊數少的形狀,邊數由我們指定的精確度決定。這是Douglas-Peucker演算法的實現。

要理解這個,假設你試圖找一個圖像里的方塊,但是由於圖像里的一些問題,你得不到一個完美的方塊,只能得到一個「壞方塊」。現在你可以使用這個函數來近似,第二個參數叫epsilon,是從輪廓到近似輪廓的最大距離。是一個准確率參數,好的epsilon的選擇可以得到正確的輸出。

在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數指定曲線是否閉合。

5.凸形外殼

凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結果)。這兒,cv2.convexHull()函數檢查凸面曲線缺陷並修復它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。

參數詳情:

·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然後會返回外殼的點的坐標。如果為False,它會返回輪廓對應外殼點的索引。

所以要獲得凸形外殼,下面

但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]]  是四個角的點。如果你用returnPoints = False,我會得到下面的結果:[[129], [67], [0], [142]].  這是輪廓里對應點的索引,比如cnt[129] = [234, 202]],這和前面結果一樣。

6.檢查凸面

有一個函數用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。

7.邊界矩形

有兩種邊界矩形

7.a.正邊界矩形

這個矩形不考慮對象的旋轉,所以邊界矩形的面積不是最小的,函數是cv2.boundingRect()。

假設矩形左上角的坐標是(x,y), (w, h)是它的寬和高

7.b.渲染矩形

這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉。函數是cv2.minAreaRect()。它返回一個Box2D結構,包含了(左上角(x,y),(width, height),旋轉角度)。但是要畫這個矩形我們需要4個角。這四個角用函數cv2.boxPoints()得到

8.最小閉包圓

我們找一個目標的外接圓可以用函數cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。

9.橢圓

用一個橢圓來匹配目標。它返回一個旋轉了的矩形的內接橢圓

10. 直線

類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。

END

熱點內容
linux分區表查看 發布:2025-03-16 21:20:17 瀏覽:643
java多個if 發布:2025-03-16 21:15:46 瀏覽:694
可樂存儲 發布:2025-03-16 21:15:07 瀏覽:871
ios遷移安卓用什麼助手 發布:2025-03-16 20:12:42 瀏覽:720
python異常值處理 發布:2025-03-16 20:12:42 瀏覽:581
POtn編程 發布:2025-03-16 20:06:11 瀏覽:776
競彩資金怎麼配置 發布:2025-03-16 20:01:57 瀏覽:10
在終端中打開編譯環境 發布:2025-03-16 19:57:34 瀏覽:601
sqlserver安裝資料庫 發布:2025-03-16 19:57:01 瀏覽:36
如何關掉廣告推送安卓 發布:2025-03-16 19:43:32 瀏覽:959