Python 影像輪廓檢測

shape.jpg

首先,我們import cv2,並讀取本次學習中要用到的圖像('shape.jpg')檔。

import cv2
img = cv2.imread('shape.jpg')

接著,將圖片轉灰階。

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #轉灰階

從此處開始進入主軸,檢測圖像的邊緣(圖片, 最低門檻值, 最高門檻值)。

檢測邊緣後,如下圖canny.jpg所示。

canny = cv2.Canny(img, 150, 200)  #檢測邊緣(圖片, 最低門檻值, 最高門檻值)

 canny.jpg

接著這段程式碼用來偵測圖像的輪廓(做偵測的圖片, 使用的模式(外輪廓/內輪廓/內外輪廓), 近似方法(or又可稱壓縮的方法,水平輪廓點/垂直輪廓點/不做壓縮(保留所有輪廓點)))。

coutours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  #偵測輪廓(做偵測的圖片, 使用的模式(外輪廓/內輪廓/內外輪廓), 近似方法(or壓縮的方法,水平輪廓點/垂直輪廓點/不做壓縮(保留所有輪廓點)))

coutours代表輪廓 ; hierarchy代表階層。

這裡我們為了與原圖進行比較,所以先複製了一張原圖來進行繪製。

首先我們將得到的所有輪廓點(coutours)進行繪製。使用cv2的drawContours,將輪廓點畫在之前複製好的原圖上。-1代表繪製每個輪廓點,(255,0,0)代表線條顏色(綠色) ,4代表線條的粗細。

area: 輪廓形狀的面積。

為了減少所受圖像中躁點的影響,將面積小於500的忽略。

peri: 輪廓外框總長,True: 輪廓為封閉,False: 輪廓非閉合。

vertices: 用多邊形近似輪廓(,近似值(大:多邊形邊增加,小:多邊形邊減少),是否閉合)。

corners: 頂點數目。

cv2.rectangle: 繪製方框(藍色線條),x,y,w,h: 方框位置,線條粗細。

最後我們可以根據頂點數目判斷它為何種圖形。3: 三角形,4: 四方型,5: 五邊形,>5: 圓形。

imgCoutour = img.copy()  #複製原圖
for cnt in coutours:
    cv2.drawContours(imgCoutour, cnt, -1, (255,0,0), 4)  #(畫在哪張圖上, 要畫的輪廓, 要畫第幾個輪廓點(-1代表每個都畫), 要用什麼顏色來畫(綠色), 線條的粗度)
    area = cv2.contourArea(cnt)  # 取得輪廓形狀的面積
    if area > 500:        
        #print(cv2.arcLength(cnt, True))  # 取得輪廓外框總長(True: 輪廓為封閉,False: 輪廓非閉合)
        peri = cv2.arcLength(cnt, True)
        vertices = cv2.approxPolyDP(cnt, peri*0.02, True)  #用多邊形近似輪廓(,近似值(大:多邊形邊增加,小:多邊形邊減少),是否閉合)
        corners = len(vertices) # 頂點數目
        x,y,w,h = cv2.boundingRect(vertices)
        cv2.rectangle(imgCoutour, (x,y), (x+w,y+h),(0,255,0),4)  #把它框起來(藍色線條),方框位置設定
        if corners == 3:
            cv2.putText(imgCoutour, 'Triangle', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
        elif corners == 4:
            cv2.putText(imgCoutour, 'recgtangle', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
        elif corners == 5:
            cv2.putText(imgCoutour, 'pentagon', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
        elif corners > 5:
            cv2.putText(imgCoutour, 'circle', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)

 imgCoutour.jpg

最後,再來補充一下基本知識:

匯入影像:

img = cv2.imread('shape.jpg')

顯示影像:

cv2.imshow('img',img)
cv2.waitKey(0)

儲存影像:

cv2.imwrite('canny.jpg', canny)

筆記到此結束囉~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值