一、轉化為灰度圖
path = 'Resources/shapes.png'
img = cv2.imread(path)
imgContour = img.copy()
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
轉換為灰度圖之后
二、模糊處理
GaussianBlur()函式
對影像進行平滑(模糊)處理,上面代碼展示是對灰度影像的模糊化處理,
imgBlue = cv2.GaussianBlur(imgGray,(7,7),1)
常用的引數是 cv2.GaussianBlur(src, (blur1, blur2), 0):
第一個引數指的是原影像,
第二個引數高斯核大小,一般是奇數,其中越大則模糊程度越大,(1,1)則表示不處理,兩個數可以不同,
第三個引數指的是標準差,一般取0,
三、邊緣檢測
Canny()函式
對影像進行邊緣檢測,在使用高斯濾波去除影像噪點消除影響后,可以對影像進行邊緣檢測,常用引數cv2.Canny(src, thresh1, thresh2) :
第一個引數:src表示輸入的圖片,
第二個引數:thresh1表示最小閾值,
第三個引數:thresh2表示最大閾值,雙閾值用于刪選邊緣資訊,
imgCanny = cv2.Canny(imgBlue,50,50)
四、輪廓識別讀取
cv2.findContours()函式
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
第一個引數是尋找輪廓的影像
第二個引數表示輪廓的檢索模式,有四種:
cv2.RETR_EXTERNAL表示只檢測外輪廓
cv2.RETR_LIST檢測的輪廓不建立等級關系
cv2.RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界資訊,如果內孔內還有一個連通物體,這個物體的邊界也在頂層,
cv2.RETR_TREE建立一個等級樹結構的輪廓,
第三個引數method為輪廓的近似辦法
cv2.CHAIN_APPROX_NONE存盤所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓資訊
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似演算法
coutuors,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
回傳值
contour回傳值
v2.findContours()函式首先回傳一個list,list中每個元素(本例為2個)都是影像中的一個輪廓資訊,list中每個元素(輪廓資訊)型別為ndarray,len(contours[1]) 表示第一個輪廓儲存的元素個數,即該輪廓中儲存的點的個數,本例第一個輪廓為矩形,輪廓中有4個點,這是因為當引數mode 設定成: cv2.CHAIN_APPROX_SIMPLE ,輪廓中并不是存盤輪廓上所有的點,而是只存盤可以用直線描述輪廓的點的個數,比如一個“正立”的矩形,只需4個頂點就能描述輪廓,
print(type(contours)) # 輸出為:<class 'list'>
print(type(contours[0])) # 輸出為:<class 'numpy.ndarray'>
print(len(contours)) # 影像中輪廓的數量,輸出為:2
print(len(contours[1])) # 輪廓1(矩形)中的元素(點)的數量, 輸出為:4
hierarchy:
此外,該函式還可回傳一個可選的hiararchy結果,這是一個ndarray,其中的元素個數和輪廓個數相同,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數,
五、輪廓的繪制
cv2.drawContours()函式
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
- 第一個引數是指明在哪幅影像上繪制輪廓;
- 第二個引數是輪廓本身,在Python中是一個list,
- 第三個引數指定繪制輪廓list中的哪條輪廓,如果是-1,則繪制其中的所有輪廓,后面的引數很簡單,其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式,
cv2.drawContours(imgContour,cnt,-1,(0,255,0),3)
def getContours(img):
coutuors,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in coutuors:
area = cv2.contourArea(cnt)
print(area)
if area>500:##識別圖形并過濾
cv2.drawContours(imgContour,cnt,-1,(0,255,0),3)
peri = cv2.arcLength(cnt,True)
print(peri)
approx = cv2.approxPolyDP(cnt,0.02*peri,True)
print(len(approx))##找近似角點
六、輪廓屬性
.1.輪廓面積
輪廓面積由函式cv2.contourArea()得到
area=cv2.contourArea(cnt)
2.輪廓周長
以用cv2.arcLength()函式得到,第二個引數指定形狀是否是閉合的輪廓(如果傳True),或者只是個曲線,
perimeter=cv2.arcLength(cnt,True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290373.html
標籤:其他
上一篇:亂數的生成+猜數字游戲
