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

1圖像矩

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

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

import cv2

import numpy as np

img = cv2.imread('star.jpg',0)

ret,thresh = cv2.threshold(img,127,255,0)

contours,hierarchy = cv2.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv2.moments(cnt)

print M

你可以從這個里面得到有用的數(shù)據(jù)比如面積丽蝎,重心等猎拨。重心可以用下面的式子得到:

cx=int(M['m10']/M['m00'])

cy=int(M['m01']/M['m00'])

2.輪廓面積

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

area=cv2.contourArea(cnt)

3.輪廓周長

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

perimeter=cv2.arcLength(cnt,True)

4.輪廓近似

這會把輪廓形狀近似成別的邊數(shù)少的形狀国觉,邊數(shù)由我們指定的精確度決定吧恃。這是Douglas-Peucker算法的實現(xiàn)。

要理解這個麻诀,假設(shè)你試圖找一個圖像里的方塊痕寓,但是由于圖像里的一些問題,你得不到一個完美的方塊蝇闭,只能得到一個“壞方塊”∩肼剩現(xiàn)在你可以使用這個函數(shù)來近似,第二個參數(shù)叫epsilon丁眼,是從輪廓到近似輪廓的最大距離筷凤。是一個準(zhǔn)確率參數(shù),好的epsilon的選擇可以得到正確的輸出。

epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

在下面第二個圖像里藐守,綠線顯示了epsilon = 10% of arc length 的近似曲線挪丢。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數(shù)指定曲線是否閉合卢厂。

5.凸形外殼

凸形外殼和輪廓近似類似乾蓬,但是還不一樣(某些情況下兩個甚至提供了同樣的結(jié)果)。這兒慎恒,cv2.convexHull()函數(shù)檢查凸面曲線缺陷并修復(fù)它任内。一般來說,凸面曲線總是外凸的融柬,至少是平的死嗦,如果它內(nèi)凹了,這就叫凸面缺陷粒氧。比如下面這張圖越除,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷外盯,是輪廓外殼的最大偏差摘盆。


hull = cv2.convexHull(points[, hull[, clockwise[, returnPoints]]

參數(shù)詳情:

·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標(biāo)示饱苟,如果是True孩擂,輸出凸形外殼是順時針方向的。否則箱熬,是逆時針的类垦。
·returnPoints:默認(rèn)是True。然后會返回外殼的點的坐標(biāo)坦弟。如果為False护锤,它會返回輪廓對應(yīng)外殼點的索引。

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

hull=cv2.convexHull(cnt)

但是如果你想找到凸面缺陷烙懦,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說赤炒,首先我找到他的輪廓cnt氯析,現(xiàn)在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]] ?是四個角的點莺褒。如果你用returnPoints = False掩缓,我會得到下面的結(jié)果:[[129], [67], [0], [142]]. ?這是輪廓里對應(yīng)點的索引,比如cnt[129] = [234, 202]]遵岩,這和前面結(jié)果一樣你辣。

6.檢查凸面

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

k=cv2.isContourConvex(cnt)

7.邊界矩形

有兩種邊界矩形

7.a.正邊界矩形

這個矩形不考慮對象的旋轉(zhuǎn),所以邊界矩形的面積不是最小的舍哄,函數(shù)是cv2.boundingRect()宴凉。

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

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

7.b.渲染矩形

這個邊界矩形是用最小面積畫出來的表悬,所以要考慮旋轉(zhuǎn)弥锄。函數(shù)是cv2.minAreaRect()。它返回一個Box2D結(jié)構(gòu)蟆沫,包含了(左上角(x,y)籽暇,(width, height),旋轉(zhuǎn)角度)。但是要畫這個矩形我們需要4個角饭庞。這四個角用函數(shù)cv2.boxPoints()得到

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
im = cv2.drawContours(im,[box],0,(0,0,255),2)

8.最小閉包圓

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

(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)

9.橢圓

用一個橢圓來匹配目標(biāo)。它返回一個旋轉(zhuǎn)了的矩形的內(nèi)接橢圓

ellipse=cv2.fitEllipse(cnt)
im=cv2.ellipse(im,ellipse,(0,255,0),2)

10. 直線

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

rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
img = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)


END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捏顺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纬黎,更是在濱河造成了極大的恐慌幅骄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件本今,死亡現(xiàn)場離奇詭異拆座,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冠息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門挪凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逛艰,你說我怎么就攤上這事躏碳。” “怎么了散怖?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵菇绵,是天一觀的道長。 經(jīng)常有香客問我镇眷,道長咬最,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任欠动,我火速辦了婚禮永乌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己翅雏,他們只是感情好圈驼,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枚荣,像睡著了一般碗脊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音友酱,去河邊找鬼脐雪。 笑死,一個胖子當(dāng)著我的面吹牛邀杏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芬沉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阁猜?” 一聲冷哼從身側(cè)響起丸逸,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剃袍,沒想到半個月后黄刚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡民效,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年憔维,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畏邢。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡业扒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舒萎,到底是詐尸還是另有隱情程储,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布臂寝,位于F島的核電站虱肄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏交煞。R本人自食惡果不足惜咏窿,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望素征。 院中可真熱鬧集嵌,春花似錦萝挤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凤粗,卻和暖如春酥泛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫌拣。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工柔袁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人异逐。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓捶索,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灰瞻。 傳聞我的和親對象是個殘疾皇子腥例,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容