پردازش تصویر در OpenCV
تبدیل هاف برای دوایر (Hough Circle Transform)
هدف#
در این فصل،
- یاد میگیریم که چگونه از تبدیل هاف برای یافتن دوایر در یک تصویر استفاده کنیم.
- تابع زیر را خواهیم دید: cv.HoughCircles()
تئوری#
یک دایره به صورت ریاضی به شکل نمایش داده میشود، که در آن مرکز دایره و شعاع دایره است. از این معادله میبینیم که ۳ پارامتر داریم، بنابراین به یک جمعکننده سهبعدی (3D accumulator) برای تبدیل هاف نیاز داریم که بسیار ناکارآمد خواهد بود. به همین دلیل OpenCV از روشی هوشمندانهتر به نام روش گرادیان هاف (Hough Gradient Method) استفاده میکند که از اطلاعات گرادیان لبهها بهره میبرد.
تابعی که اینجا استفاده میکنیم cv.HoughCircles() است. آرگومانهای زیادی دارد که در مستندات به خوبی توضیح داده شدهاند. بنابراین مستقیماً به سراغ کد میرویم.
import numpy as np
import cv2 as cv
img = cv.imread('opencv-logo-white.png', cv.IMREAD_GRAYSCALE)
assert img is not None, "file could not be read, check with os.path.exists()"
img = cv.medianBlur(img,5)
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
circles = cv.HoughCircles(img,cv.HOUGH_GRADIENT,1,20,
param1=50,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv.imshow('detected circles',cimg)
cv.waitKey(0)
cv.destroyAllWindows()
نتیجه در زیر نمایش داده شده است:
