通過霍夫圓檢測來檢測圖片中的圓形。例如鋼管檢測
HoughCircles裏面的參數是可以自己設置的,具體參數的設置,在文章的最後。
再把參數調整一下檢測效果還會好一些。
import cv2 as cv
import numpy as np
image1 = cv.imread("zzw.jpg") #讀取要檢測的圖片
se = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
image = cv.morphologyEx(image1, cv.MORPH_GRADIENT, se)
cv.imwrite("image.png", image)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
circles= cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, 10, param1=100, param2=35, minRadius=5, maxRadius=30)
for c in circles[0]:
print(c)
x, y, r = c
b = np.random.randint(0, 256)
g = np.random.randint(0, 256)
r = np.random.randint(0, 256)
cv.circle(image1,(c[0],c[1]),c[2],(255,0,0),5) #將檢測到的圓畫到圖片上
print(len(circles[0]))
cv.imwrite("hough_det.png", image1) #保存圖片
霍夫圓檢測參數:
cv.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
image:參數圖像8位,單通道,灰度輸入圖像。
method:參數方法檢測方法,參數圓輸出找到的圓的矢量的方法。上面用的是基於梯度的霍夫圓檢測。
dp:累加器分辨率與圖像分辨率的反比。例如,如果dp=1,累加器的分辨率與輸入圖像相同。如果dp=2,累加器一半的寬度和高度。
minDist:檢測圓中心之間的最小距離。如果參數爲太小,除了一個真正的圓外,可能還會錯誤地檢測到多個相鄰圓。如果是太大,有些圓可能會丟失。
param1:第一個方法特定參數。在hough_梯度的情況下,它是較高的通過Canny邊緣檢測器的兩個閾值(較低的閾值小兩倍)。
param2:第二個方法特定參數。在hough_梯度的情況下,它是檢測階段圓心的累加器閾值。它越小,就越多 可能會檢測到假圓。與較大的累加器值相對應的圓先返回。
minRadius:最小半徑最小圓半徑。
maxRadius:最大半徑最大圓半徑。如果<=0,則使用最大圖像尺寸。如果<0,則返回沒有找到半徑的中心。