• Hough Transform ile Görüntüdeki Daireleri Bulmak

    Hough Transform ile Görüntüdeki Daireleri Bulmak

    Yazarlar: Gökhan KARAAHMETOĞLU, Emrecan ÇELİK, Muzaffer Kadir YILMAZ Hough Dönüşümü sayısal görüntü işlemede matematiksel olarak ifade edilebilen şekillerin varlığının, yerinin, açılarının bulunmasında kullanılmaktadır. Yöntem 1962 yılında Paul Hough tarafından geliştirilmiştir. Yöntem ilk bulunduğunda, bir resimdeki doğruların tespit edilmesini amaçlamaktaydı. Daha sonrasında bu dönüşüm dairelerin ve rastgele şekillerin tespitinde de kullanılmıştır. Sayısal görüntülerde geometrik şekil bulmanın…

Hough Transform ile Görüntüdeki Daireleri Bulmak

Yazarlar: Gökhan KARAAHMETOĞLU, Emrecan ÇELİK, Muzaffer Kadir YILMAZ

Hough Dönüşümü sayısal görüntü işlemede matematiksel olarak ifade edilebilen şekillerin varlığının, yerinin, açılarının bulunmasında kullanılmaktadır. Yöntem 1962 yılında Paul Hough tarafından geliştirilmiştir. Yöntem ilk bulunduğunda, bir resimdeki doğruların tespit edilmesini amaçlamaktaydı. Daha sonrasında bu dönüşüm dairelerin ve rastgele şekillerin tespitinde de kullanılmıştır.

Sayısal görüntülerde geometrik şekil bulmanın görüntü işlemede birçok uygulama alanı bulunmaktadır. İris bulma, plaka bulma, saha üzerinde top bulma, duvar üzerinde portre bulma, masa üzerinde kalem bulma veya nesne üzerinde düzgün, düzgün olmayan kusurlu bölgeyi bulma görüntü üzerinde algoritmalar kullanılarak tespit edilebilir.

Görüntüdeki gürültülerden bağımsız olarak başarılı sonuçlar verebilmesi Hough dönüşümünün temel avantajıdır. Hough dönüşümü içerdiği parametreler sayesinde görüntüdeki nesnelerin sınırlarını belirleyen noktaların aranması sırasında geçen zamanı azaltmaktadır. Bu avantajlarına rağmen Hough dönüşümünün bazı dezavantajları da bulunmaktadır. Büyük boyutlu görüntülerdeki veri yoğunluğu fazla olduğundan dolayı görüntüdeki nesnelerin tespiti uzun zaman alabilmektedir.

Hough dönüşümü temelde kenarların olası geometrik şekilleri oylaması mantığı ile çalışmaktadır. Hough dönüşümü kullanılarak şekil tespiti genel olarak aşağıdaki adımlar ile özetlenebilir.

  • Kaynak görüntü üzerinde kenarlar belirlenir.
  • Bir eşikleme yöntemi kullanılarak görüntü ikili (siyah,beyaz) hale getirilir.
  • Her kenar pikseli için noktanın üzerinde olabileceği olası geometrik şekillerin polar koordinattaki değerleri kullanılan bir matris üzerinde birer birer artırılarak her kenar pikselin olası şekilleri oylaması sağlanmış olur.
  • Matris değeri en yüksek olan şekiller en çok oy alan şekiller olduklarından görüntü üzerinde bulunma veya belirgin olma olasılıkları en yüksek olmaktadır.

Bulunan şekiller isteğe bağlı olarak görüntü üzerine yazdırılabilir. Kaynak görüntüler üzerinde dairesel şekil arandığından kullanılan matrisi çemberin merkezi olan [a,b] noktaları ve yarıçap değeri [r] olmak üzere üç boyuttan oluşmaktadır. Belirlenen aralıktaki yarıçap değerleri için çember merkezi çember denklemi ile bulunur.

Örneğin aşağıdaki görselde yer alan sarı çember için Hough Dönüşümü uygulanmaktadır.

Hough dönüşümü uzayında, görsel uzayında bulunan çemberdeki her bir nokta için yarıçapı [r] uzunluğunda olan çemberler aşağıdaki denkleme göre çizilir.

Hough uzayında çizilen çemberlerin birbirleriyle en çok kesiştiği nokta, orijinal uzaydaki çemberimizin merkez noktasını vermektedir.

 

Ancak merkez noktanın bulunabilmesi için Hough uzayındaki çemberlerin yarıçapının orijinal çemberdeki yarıçapa yakın olması gerekmektedir. Aksi halde kesişimler olmayacak veya az sayıda olacaktır.

Yarıçapın tespiti için daha önceden belirlenmiş maksimum ve minimum [r] değerleri arasında çemberler çizilmeli, Hough uzayı 3 boyutlu hale getirilmelidir.

Yukarıdaki görselde yarıçap değeri maksimum 20 minimum 10 olarak belirlenmiştir. Yarıçapın bilinmediği bu tür durumlar için çizimler 3 boyutlu uzayda bir koniyi andırır. ve yeniden orijinal uzaydaki her nokta için çemberler çizilir.

Hough Transform’u Python ve OpenCV Kullanarak Gerçeklemek

fileName = 'input/Result.jpg'
roi = cv2.imread(fileName)
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
gray_blur = cv2.GaussianBlur(gray, (15, 15), 0)
canny_threshold_1=50
canny_threshold_2=120
gray_blur = cv2.Canny(gray_blur,canny_threshold_1,canny_threshold_2)
hough_param_1=50
hough_param_2=30
circles = cv2.HoughCircles(gray_blur,cv2.HOUGH_GRADIENT,1,20, param1=hough_param_1,param2=hough_param_2,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
        cv2.circle(roi,(i[0],i[1]),i[2],(0,255,0),2)
        cv2.circle(roi, (i[0], i[1]),2, (0,0,255), 3)
cv2.imshow('Detected coins',roi)
cv2.imwrite('output/'+fileName,roi)
cv2.waitKey()

Kaynaklar:

Jain, N., ve Jain, N., 2012. Coin recognition using circular Hough transform. Int. J. Electron. Commun. Comput. Technol , 2(3),

Çelik, A. & Tekin, E. (2020). Hough Transform Görüntü İşleme Yöntemiyle Ekim Makineleri için Tohum Sayma Uygulaması. Avrupa Bilim ve Teknoloji Dergisi, (Özel Sayı), 260-267.

http://datahacker.rs/opencv-circle-detection-hough-transform/

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html