1. 程式人生 > >python下用OpenCV的圓形檢測

python下用OpenCV的圓形檢測

常用 初始 text 變化 查看類 變換 大量 畫出 處理

寫在文章前

這些天因為工作需要要學習圖像檢測,笨笨的我啥都不會要盯著OpenCV重頭開始學(;′⌒`),甚至查資料能力都很弱弱〒▽〒

誇一下我最好的男票(*^▽^*) 男盆友也不是做圖像處理的 但是心疼我的笨(〃‘▽‘〃)

讓我把要求給他(っ??ω??)っ??? 他放下手中的遊戲 花了一兩天給我做出來然後寫了份詳細說明書φ(>ω<*)

當然是記下來 ?(?????)?

??▽ ???3?? 學習去咯

一.簡介:

初次使用python的你一定感受到了python的便捷。作為高級編程語言只需調用類庫即可。

對於圓形物體識別問題,opencv提供了大量方法。

代碼文末附上

二.檢測步驟:

2.1讀取圖像

窗口1(初始圖像未經過處理)

技術分享圖片

2.2降噪處理

由於圖像中存在大量噪點(什麽是噪點參考https://www.zhihu.com/question/23877970

利用降噪方法cv2.blur(img, (5,5))

其中兩個參數為橫向縱向的模糊程度,數值越大越模糊

這是55的模糊程度

技術分享圖片

這是2020的模糊程度

技術分享圖片

這裏我們用55效果測試下來最佳

2.3灰度化

灰度化常用於色彩豐富的圖像,類似ps中的失色操作。

方法:cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)

技術分享圖片

由於原圖像就是黑白主色調,所以去色改變不大

2.4霍夫變化圓檢測

之前的降噪和灰度化都是為了這一步的檢測

參考文章http://lib.csdn.net/article/opencv/24037

方法如下:

cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

參數1 image:傳遞圖像

參數2 method:默認,不用理解

參數3 dp:默認,不用理解

參數4 minDist:不同圓心的最小距離,單位為像素

參數5 涉及到Canny算法,這裏的80canny算法的上限,這裏的canny算法下限自動設置為為上限一半,馬上介紹canny算法

參數

6 需要理解上面的參考文章,可以認為是需要達到的累加數量

參數78 為最小半徑和最大半徑,避免識別白色的圓圈

技術分享圖片

那麽什麽是canny算法呢?簡單來說就是邊緣檢測算法

具體實現效果可以參考方法:cv2.Canny(img, 27, 54),顯示效果為

技術分享圖片

加大參數邊緣就越少,我們用到的就是這種效果,即設置上限為80

cv2.Canny(img, 40, 80)

技術分享圖片

最終

circles=cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

會將所有識別的圓形參數(圓心位置,半徑)保存到circles

可以認為是一個數組中

2.5標記

根據2.4獲取的圖像信息利用cv2.circle()方法進行圈畫

技術分享圖片

大功告成,可以調整參數達到滿意的效果。

三.附上代碼

# -*- coding: utf-8 -*-
import  cv2
#載入並顯示圖片
img=cv2.imread(‘1.jpg‘)
cv2.imshow(‘1‘,img)
#降噪(模糊處理用來減少瑕疵點)
result = cv2.blur(img, (5,5))
cv2.imshow(‘2‘,result)
#灰度化,就是去色(類似老式照片)
gray=cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)
cv2.imshow(‘3‘,gray)

#param1的具體實現,用於邊緣檢測    
canny = cv2.Canny(img, 40, 80)   
cv2.imshow(‘4‘, canny)  


#霍夫變換圓檢測
circles= cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)
#輸出返回值,方便查看類型
print(circles)

#輸出檢測到圓的個數
print(len(circles[0]))

print(‘-------------我是條分割線-----------------‘)
#根據檢測到圓的信息,畫出每一個圓
for circle in circles[0]:
    #圓的基本信息
    print(circle[2])
    #坐標行列(就是圓心)
    x=int(circle[0])
    y=int(circle[1])
    #半徑
    r=int(circle[2])
    #在原圖用指定顏色圈出圓,參數設定為int所以圈畫存在誤差
    img=cv2.circle(img,(x,y),r,(0,0,255),1,8,0)
#顯示新圖像
cv2.imshow(‘5‘,img)

#按任意鍵退出
cv2.waitKey(0)
cv2.destroyAllWindows()

python下用OpenCV的圓形檢測