پردازش تصویر در OpenCV

تبدیل هاف برای دوایر (Hough Circle Transform)

۱ دقیقه مطالعهOpenCV 5.xبه‌روزرسانی:

هدف#

در این فصل،

  • یاد می‌گیریم که چگونه از تبدیل هاف برای یافتن دوایر در یک تصویر استفاده کنیم.
  • تابع زیر را خواهیم دید: 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()

نتیجه در زیر نمایش داده شده است:

تبدیل هاف برای دوایر (Hough Circle Transform) — تصویر ۱