python下用OpenCV的圓形檢測
寫在文章前
這些天因為工作需要要學習圖像檢測,笨笨的我啥都不會要盯著OpenCV重頭開始學(;′⌒`),甚至查資料能力都很弱弱〒▽〒
誇一下我最好的男票(*^▽^*) 男盆友也不是做圖像處理的 但是心疼我的笨(〃‘▽‘〃)
讓我把要求給他(っ??ω??)っ??? 他放下手中的遊戲 花了一兩天給我做出來然後寫了份詳細說明書φ(>ω<*)
當然是記下來 ?(?????)?
??▽ ???3?? 學習去咯
一.簡介:
初次使用python的你一定感受到了python的便捷。作為高級編程語言只需調用類庫即可。
對於圓形物體識別問題,opencv提供了大量方法。
(代碼文末附上
二.檢測步驟:
2.1讀取圖像
窗口1(初始圖像未經過處理)
2.2降噪處理
由於圖像中存在大量噪點(什麽是噪點參考https://www.zhihu.com/question/23877970)
利用降噪方法cv2.blur(img, (5,5))
其中兩個參數為橫向縱向的模糊程度,數值越大越模糊
這是5,5的模糊程度
這是20,20的模糊程度
這裏我們用5,5效果測試下來最佳
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算法,這裏的80為canny算法的上限,這裏的canny算法下限自動設置為為上限一半,馬上介紹canny算法
參數
參數7,8 為最小半徑和最大半徑,避免識別白色的圓圈
那麽什麽是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的圓形檢測