1.通過OpenCV的findContours可以很方便的找到圖片中內(nèi)容的輪廓。
2.為了提取輪廓有更高的準(zhǔn)確率,在提取輪廓前,需要對(duì)圖片進(jìn)行預(yù)處理(二值+閾值),只保留感興趣的圖像。
3.通過計(jì)算輪廓面積與外接矩形或外接圓的面積,可以找到輪廓特征,進(jìn)一步篩選出感興趣的輪廓。
語法:cv2.findContours(img,mode,method)
mode:輪廓檢索模式
RETR_EXTERNAL:只檢最外面的輪廊
RETR_LIST:檢索所有的輪廊,并將其保存到一條鏈表當(dāng)中
RETR_CCOMP:檢索所有的輪廓,并將他們組織為兩層:頂層是各部份的外部邊界,第二層是空洞的邊界
RETR_TREE:檢索所有的輪廓,并重構(gòu)嵌套輪廓的整個(gè)層次(常用這個(gè))
method:輪廓逼近方法
CHAIN_APPROX_NONE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點(diǎn)的序列)。
CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部,也就是,函數(shù)只保留他們的終點(diǎn)部分。
為了更高的準(zhǔn)確率,使用二值圖像
示例代碼?
import cv2
import math
import numpy as np
#圖像輪廓
#語法:cv2.findContours(img,mode,method)
# mode:輪廓檢索模式
#RETR_EXTERNAL:只檢最外面的輪廊
#RETR_LIST:檢索所有的輪廊,并將其保存到一條鏈表當(dāng)中
#RETR_CCOMP:檢索所有的輪廓,并將他們組織為兩層:頂層是各部份的外部邊界,第二層是空洞的邊界
#RETR_TREE:檢索所有的輪廓,并重構(gòu)嵌套輪廓的整個(gè)層次
# method:輪廓逼近方法
#CHAIN_APPROX_NONE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點(diǎn)的序列)。
#CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部,也就是,函數(shù)只保留他們的終點(diǎn)部分。
#為了更高的準(zhǔn)確率,使用二值圖像
def cv_show(name, img):
cv2.imshow(name, img) # 顯示圖像
cv2.waitKey(0) # 等待時(shí)間,單位毫秒,0表示任意鍵終止
cv2.destroyAllWindows()
#1.讀取圖像
image = cv2.imread("C:\\Users\\zhangqs\\Desktop\\cv.png")
#2.預(yù)處理
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #灰度圖
ret,threshold=cv2.threshold(gray,160,255,cv2.THRESH_BINARY) #閾值處理
#3.查找輪廓
contours,hierarchy=cv2.findContours(threshold,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
print('共找到',len(contours),'個(gè)輪廓')
#4.繪制輪廓
#在原圖上繪制輪廓
draw2=image.copy() #注意:需要copy一下,否則將會(huì)改動(dòng)原圖
drawed2=cv2.drawContours(draw2,contours,-1,(0,0,255),2) #圖像,輪廓,輪廓索引,顏色模式,線條厚度
cv_show('draw_contours',draw2)
#在灰度圖上繪制輪廓(下面的np.hstack函數(shù)要求數(shù)組維度一致,才能比較顯示)
draw=gray.copy() #注意:需要copy一下,否則將會(huì)改動(dòng)原圖
drawed=cv2.drawContours(draw,contours,-1,(0,0,255),2) #圖像,輪廓,輪廓索引,顏色模式,線條厚度
#5.輪廓近似
#外接矩形(綠色線)
cnt=contours[12]
# epsilon=0.1*cv2.arcLength(cnt,True)
# approx=cv2.approxPolyDP(cnt,epsilon,True)
x,y,w,h=cv2.boundingRect(cnt)
imgRectangle=cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
cv_show('Rectangle',imgRectangle)
area=cv2.contourArea(cnt) #輪廓面積
rectArea=w*h #外接矩形面積
rate=float(area)/rectArea
print('輪廓面積/外接矩形面積比:',rate)
#外接圓(藍(lán)色線)
cnt2=contours[11]
(x,y),radius=cv2.minEnclosingCircle(cnt2)
center=(int(x),int(y))
radius=int(radius)
imgCircle=cv2.circle(image,center,radius,(255,0,0),2)
cv_show('Circle',imgCircle)
areaCircle=cv2.contourArea(cnt) #輪廓面積
rectArea=math.pi*radius*radius #外接圓面積
rateCircle=float(areaCircle)/areaCircle
print('輪廓面積/外接圓面積比:',rateCircle)
# #合并顯示
# res=np.hstack((gray,threshold,drawed)) #注意:兩層括號(hào)
# cv2.imshow('all',res)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
運(yùn)行結(jié)果
?原圖?
輪廓圖?
外接矩形(綠色線條)?
?外接圓(藍(lán)色線條)
文章來源:http://www.zghlxwxcb.cn/news/detail-491839.html
?遍歷輪廓,通過計(jì)算面積比,就可以找到輪廓特征,也就篩選出我們感興趣的輪廓了。文章來源地址http://www.zghlxwxcb.cn/news/detail-491839.html
到了這里,關(guān)于7.OpenCV-圖像輪廓的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!