一.簡介:
初次使用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算法
參數6 需要理解上面的參考文章,可以認為是需要達到的累加數量
參數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()
