Bilgisayarlı Görü

Hough Dönüşümü ve Köşe Tespiti

Dr. Öğr. Üyesi Oğuz Emre Kural

2026

Kenarlardan Şekillere

Önceki derslerde Canny ve Sobel gibi operatörlerle kenar tespiti yapmayı öğrendik.

Ancak kenar tespiti bize sadece “burada bir değişim var” diyen pikselleri (binary harita) verir. Bu piksellerin bir doğru mu yoksa bir daire mi oluşturduğunu matematiksel olarak bilmiyoruz.

Soru: Bu dağınık kenar noktalarını (pikselleri) nasıl anlamlı geometrik şekillere dönüştürebiliriz?

Cevap: Hough Dönüşümü (Hough Transform).

Hough Dönüşümü Nedir?

  • Paul Hough tarafından 1962’de patenti alınan bir yöntemdir.
  • Görüntüdeki şekillerin (özellikle doğrular ve daireler) matematiksel olarak tespit edilmesini sağlar.
  • Gürültüye ve kısmi bozulmalara (kopuk çizgilere) karşı oldukça dayanıklıdır.
  • Temel mantığı bir Oylama Sistemi (Voting System) üzerine kuruludur.

Doğru Tespiti: Kartezyen Sorunu

Bir doğruyu Kartezyen koordinat sisteminde (\(y\) ve \(x\)) şu şekilde ifade ederiz:

\[ y = mx + c \]

  • \(m\): Eğim (Slope)
  • \(c\): Kesişim noktası (Intercept)

Sorun: Dikey bir doğru düşünün (\(x = 5\)). Bu doğrunun eğimi (\(m\)) sonsuzdur. Bilgisayarlar sonsuz değerleri sevmez ve hesaplamada sorun çıkarır. Bu yüzden Hough dönüşümünde farklı bir koordinat sistemi kullanmalıyız.

Polar (Kutupsal) Koordinat Sistemi

Hough dönüşümü, doğruları temsil etmek için Rho (\(\rho\)) ve Theta (\(\theta\)) parametrelerini kullanır.

\[ \rho = x \cos \theta + y \sin \theta \]

  • \(\rho\) (Rho): Orijinden doğruya olan dik uzaklık.
  • \(\theta\) (Theta): Bu dik doğrunun x-ekseni ile yaptığı açı.

Bu gösterim sayesinde dikey doğrular dahil her türlü doğru sorunsuz ifade edilebilir.

Görüntü Uzayı vs. Hough Uzayı

Hough dönüşümünün en can alıcı noktası burasıdır:

  1. Görüntü Uzayında (x, y) bir NOKTA, Hough Uzayında (\(\rho, \theta\)) bir SİNÜZOİDAL EĞRİ belirtir.
  2. Görüntü uzayındaki noktalar eğer aynı doğru üzerindeyse, Hough uzayındaki eğriler TEK BİR NOKTADA kesişir.

Görselleştirme

Görüntü uzayındaki noktaların Hough uzayında kesişmesi:

  • Kesişim noktası (\(\rho, \theta\)), o noktaların oluşturduğu doğrunun parametresidir.

Algoritma Adımları (Akümülatör Mantığı)

  1. Hough uzayı için 2 boyutlu bir dizi (Accumulator Array) oluşturulur (\(\theta\) ve \(\rho\) için). Başlangıçta hepsi 0’dır.
  2. Görüntüdeki her beyaz kenar piksel (\(x, y\)) için:
    • Tüm \(\theta\) açıları (0-180 derece) denenir ve \(\rho\) hesaplanır.
    • Akümülatörde o \((\rho, \theta)\) hücresinin değeri 1 arttırılır (Oylama).
  3. İşlem bittiğinde, en çok oy alan noktalar görüntüdeki en baskın doğruları temsil eder.

Görüntü Uzayı - Örnek

Hough Uzayı

Final Tespit

OpenCV’de Hough Doğru Tespiti

OpenCV’de iki tür Hough Doğru Tespiti fonksiyonu vardır:

  1. Standart Hough Dönüşümü (cv2.HoughLines)
    • Bize \((\rho, \theta)\) değerlerini verir.
    • Doğrular sonsuz uzunlukta kabul edilir.
    • Hesaplama maliyeti daha yüksektir.
  2. Olasılıksal Hough Dönüşümü (cv2.HoughLinesP)
    • Bize doğrudan çizgi segmentinin başlangıç ve bitiş koordinatlarını \((x_1, y_1, x_2, y_2)\) verir.
    • Rastgele seçilen noktalarla daha hızlı çalışır.
    • Daha pratiktir.

HoughLines vs HoughLinesP

Özellik HoughLines (Standart) HoughLinesP (Olasılıksal)
Çıktı (ρ, θ) sonsuz doğru (x₁, y₁, x₂, y₂) segment
Hız Yavaş Çok hızlı
Örnekleme Tüm pikseller Seçili pikseller
Boşluk toleransı Zayıf Güçlü
Gürültü Daha hassas Daha dayanıklı
Köşe analizi Zor Kolay
Pratik kullanım Teorik Gerçek uygulamalara uygun

cv2.HoughLinesP Parametreleri

Parametre Açıklamaları

lines = cv2.HoughLinesP(
    image,          # Kenar görüntüsü (Binary / Canny çıktısı)
    rho,            # Piksel cinsinden uzaklık çözünürlüğü (genelde 1)
    theta,          # Radyan cinsinden açı çözünürlüğü (genelde np.pi/180)
    threshold,      # Doğru kabul edilmesi için gereken minimum oy (kesişim)
    minLineLength,  # Bu değerden daha kısa olan çizgiler reddedilir
    maxLineGap      # Aynı doğru üzerindeki noktalar arası max boşluk (kopukluk)
)

Uygulama: Şerit Tespiti (Etkileşimli)

Aşağıdaki kod Pyodide aracılığıyla doğrudan tarayıcınızda çalışır. Parametrelerle (threshold, minLineLength, maxLineGap) dilediğiniz gibi oynayabilir, “Run Code” tuşu ile kodu tekrar çalıştırabilirsiniz:

Hough Daire Tespiti: Temel Fikir

Kenarlardan doğru tespit ederken, her kenar noktasının Hough uzayında bir eğri oluşturduğunu ve bu eğrilerin kesiştiği noktaların doğruyu verdiğini görmüştük.

Daire tespitinde de benzer bir fikir kullanılır:

  • Bir daireyi tanımlamak için 3 parametre gerekir:
    • Merkez: \((x_{center}, y_{center})\)
    • Yarıçap: \(r\)
  • Hough daire dönüşümü, kenar noktalarından bu parametreleri geri kazanmaya çalışır:
    • “Bu kenar noktalarını hangi merkez(ler) ve yarıçap(lar) açıklayabilir?”

Adım 1: Görüntü Uzayında Daire ve Kenar Noktaları

Önce basit bir senaryo düşünelim:

  • Görüntüde tek bir daire olsun.
  • Canny gibi bir kenar algılama yöntemi bu dairenin etrafında bir dizi kenar noktası üretir.
  • Bu noktalardan 3–4 tanesini seçip isimlendirelim (P1, P2, P3, P4).

Bu, görüntü uzayındaki (image space) manzaramızdır:

  • Bildiklerimiz: Kenar noktaları \((x_i, y_i)\)
  • Bilmediklerimiz: Dairenin merkezi \((a, b)\) ve yarıçapı \(r\)

Adım 2: Merkez Uzayında (a, b) Olası Merkezler

Dairenin denklemini hatırlayalım:

\[ (x - a)^2 + (y - b)^2 = r^2 \]

Burada: - \((a, b)\): dairenin merkezi - \(r\): yarıçap

Şimdi işi basitleştirmek için yarıçapın bilindiğini varsayalım (\(r\) sabit).

Tek bir kenar noktasına bakalım, örneğin \(P_1(x_1, y_1)\). Bu nokta için denklem:

\[ (x_1 - a)^2 + (y_1 - b)^2 = r^2 \]

Bu kez bilinmeyenler \(a\) ve \(b\) (merkezin koordinatlarıdır). Bu denklem, merkez uzayında \((a, b)\):

  • merkezi \((x_1, y_1)\) olan,
  • yarıçapı \(r\) olan bir DAİRE tanımlar.

Yani:

Görüntü uzayında tek bir nokta, merkez uzayında olası merkezleri gösteren bir daire üretir.

Adım 3: Birden Fazla Nokta → Merkezde Kesişim

Aynı mantığı diğer noktalar için de uygularsak:

  • P1 için merkez uzayında bir daire,
  • P2 için başka bir daire,
  • P3 için başka bir daire,
  • P4 için başka bir daire… oluşur.

Bu daireler ortak bir noktada kesişirlerse, bu nokta:

“Bu kenar noktalarının hepsinin üzerinde bulunduğu, yarıçapı \(r\) olan dairenin merkezidir.”

Bu, çizgisel Hough ile birebir paraleldir:

  • Doğru için: nokta → sinüzoid, sinüzoidlerin kesişimi → doğru
  • Daire için: nokta → merkez uzayında daire, bu dairelerin kesişimi → dairenin merkezi

Adım 4: Gerçekte Yarıçap da Bilinmiyor → 3B Parametre Uzayı

Gerçek görüntülerde:

  • Merkez \((a, b)\) bilinmiyor,
  • Yarıçap \(r\) da bilinmiyor.

Bu durumda parametre uzayı 3 boyutludur:

  • \((a, b, r)\)

Her kenar noktası için, çok sayıda olası yarıçap değerine karşılık:

  • Merkez uzayında daireler çizilir,
  • Bunlar 3B akümülatörde oy toplar.

Sorun:
Bu 3B akümülatör hem çok yavaş, hem de bellek açısından maliyetli olabilir.

Bu yüzden pratikte doğrudan 3B Hough yapmak yerine, daha akıllı stratejiler kullanılır.

Adım 5: Hough Gradient Yöntemi (HOUGH_GRADIENT)

OpenCV, daire tespitini hızlandırmak için gradyan bilgisini kullanır:

  1. Kenar tespiti sırasında, her kenar noktası için gradyan yönü de hesaplanır.
  2. Bir dairenin kenarında:
    • Gradyan vektörü her zaman merkeze doğru bakar.
  3. Böylece, her kenar noktası için merkez uzayında tam bir daire taramak yerine:
    • Sadece gradyan doğrultusu boyunca merkez adaylarına oy verilir.

Sonuç:

  • Parametre uzayı ciddi şekilde daralır,
  • Daire merkezleri ve yarıçapları çok daha hızlı ve daha az bellekle bulunabilir.

Adım 6: cv2.HoughCircles Fonksiyonunun Mantığı

OpenCV’de daire tespiti için kullanılan fonksiyon:

Parametre Açıklamaları

circles = cv2.HoughCircles(
    image,              # Gri seviye görüntü (⚠️ Canny uygulanmamış olmalı!)
    method,             # Genelde cv2.HOUGH_GRADIENT
    dp,                 # Akümülatör çözünürlüğü (1: orijinal, 2: yarısı)
    minDist,            # Tespit edilen daire merkezleri arası minimum mesafe
    param1,             # Canny için yüksek eşik (düşüğü otomatik olarak yarısı olur)
    param2,             # Dairenin kabul edilmesi için gereken minimum oy (Merkez oyu)
    minRadius,          # Aranacak minimum yarıçap (0: bilinmeyen)
    maxRadius           # Aranacak maksimum yarıçap (0: bilinmeyen)
)

Uygulama: Çember Sayma (Etkileşimli)

Aşağıdaki Pyodide simülasyonunda param2 değerini (kabul oyu) veya Blur seviyesini düşürdüğünüzde nelerin hatalı şekilde çember kabul edildiğini bizzat test edebilirsiniz:

Hough Dönüşümü Özet

Özellik Doğru Tespiti (HoughLinesP) Daire Tespiti (HoughCircles)
Girdi Kenar Haritası (Canny çıktısı - Binary) Gri Seviye Görüntü (Blur uygulanmış)
Yöntem Olasılıksal Oylama Gradyan Yönü + Oylama
Hız Hızlı Göreceli Yavaş
Parametreler Rho, Theta, Threshold MinDist, Param1, Param2
Kullanım Şerit, Barkod, Tablo çizgileri Göz bebeği, Hücre, Para, Trafik işaretleri

Gerçek Dünya Kullanım Alanları: Hough Dönüşümü

  • Otonom Araçlar (Şerit Takibi): Yol şeritleri doğrusal yapılar olduğundan HoughLines otonom sürüşte çok etkilidir.
  • Tıbbi Görüntüleme: Göz izleme (Iris tespiti) veya kan hücrelerinin sayımında HoughCircles inanılmaz işlevseldir.
  • Endüstriyel Kalite Kontrol: Üretim bandındaki şişelerin, madeni paraların ya da dişlilerin kusursuz olup olmadığını kontrol etmek (Daire Tespiti).
  • Dijital Belge Analizi: Akıllı telefonlarla çektiğiniz bir dökümanın kare sınırlarını bulup düzleştirmek (Document Scanner uygulamaları).

BÖLÜM 2: Özellik Çıkarımı ve Harris Köşe Tespiti

“Pencere” Analojisi

Bir odaya küçücük bir pencereden baktığınızı hayal edin. Sadece o pencerenin içini görebiliyorsunuz. Amacımız, pencerenin nerede olduğunu anlamak.

Pencereyi (Kırmızı Kare) görüntü üzerinde hafifçe sağa, sola, yukarı veya aşağı kaydıralım. Pencerenin içindeki görüntü ne kadar değişiyor?

Görsel olarak 3 durum vardır

Durum A: Düz Alan (Flat Region)

Pencere gökyüzü gibi boş bir alandaysa, onu ne tarafa hareket ettirirseniz ettirin, pencerenin içindeki görüntü değişmez.

  • Sonuç: Burası ilgi çekici değil.

Durum B: Kenar (Edge)

Pencere bir binanın kenarındaysa:

  • Kenar boyunca (yukarı-aşağı) hareket ettirirseniz görüntü değişmez.
  • Kenara dik (sağa-sola) hareket ettirirseniz görüntü aniden değişir.
  • Sonuç: Burası bir kenar, ama tam konumunu belirlemek zor (kenar boyunca nerede?).

Durum C: Köşe (Corner)

Pencere bir binanın sivri ucundaysa (köşe):

  • Pencereyi hangi yöne (sağ, sol, yukarı, aşağı, çapraz) hareket ettirirseniz ettirin, görüntü ciddi şekilde değişir.
  • Sonuç: İşte aradığımız benzersiz nokta burası!

Değişimi Ölçmek

Bu “değişimi” matematiksel bir formüle dökelim.

Görüntü üzerindeki penceremiz \((x,y)\) noktasında olsun. Bu pencereyi \((u, v)\) kadar (örneğin sağa 1, yukarı 1 piksel) kaydıralım.

Eski pencere ile yeni pencere arasındaki farkı hesaplamamız lazım. Buna Hata Kareler Toplamı (SSD - Sum of Squared Differences) diyoruz ve \(E(u,v)\) ile gösteriyoruz.

\[ E(u,v) = \sum_{x,y} \underbrace{w(x,y)}_{\text{Pencere}} [ \underbrace{I(x+u, y+v)}_{\text{Kaydırılmış}} - \underbrace{I(x,y)}_{\text{Orijinal}} ]^2 \]

  • Amaç: Öyle \((x,y)\) noktaları bulalım ki, her küçük \((u,v)\) hareketi için \(E(u,v)\) sonucu ÇOK BÜYÜK çıksın.

Taylor Serisi ve Türevler

Her bir piksel için pencereyi her yöne kaydırıp farkı hesaplamak bilgisayar için çok yavaştır. Harris burada bir matematiksel “yaklaşım” kullanır: Taylor Serisi.

Bir fonksiyonun (görüntünün) bir sonraki adımda ne olacağını, o anki eğimine (türevine) bakarak tahmin edebiliriz.

\[ I(x+u, y+v) \approx I(x,y) + I_x u + I_y v \]

  • \(I_x\): Görüntünün x yönündeki türevi (Sobel ile bulunur).
  • \(I_y\): Görüntünün y yönündeki türevi.

M Matrisinin Oluşumu

Bu tahmini, yukarıdaki ana formülümüze koyarsak, o karmaşık \(E(u,v)\) formülü aşağıdaki matris çarpımına dönüşür:

\[ E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} \underbrace{\begin{bmatrix} \sum I_x^2 & \sum I_x I_y \\ \sum I_x I_y & \sum I_y^2 \end{bmatrix}}_{M \text{ Matrisi}} \begin{bmatrix} u \\ v \end{bmatrix} \]

İşte bütün olay bu \(M\) matrisidir! Bu 2x2’lik matris, o bölgedeki tüm değişimin özetidir.

\[ M = \sum_{x,y} w(x,y) \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} \]

Özdeğerler (Eigenvalues) Ne Anlatır?

Şimdi elimizde her piksel için hesaplanmış bir \(M\) matrisi var. Bu matrisin geometrik şeklini anlamak için Özdeğerlerine (\(\lambda_1, \lambda_2\)) bakarız.

Bu özdeğerleri bir Elips gibi düşünebilirsiniz:

  • \(\lambda_1\): Elipsin uzun yarıçapı (En hızlı değişim yönü).
  • \(\lambda_2\): Elipsin kısa yarıçapı (En yavaş değişim yönü).

Bunu grafik üzerinde görselleştirelim:

Durum 1: Düz Alan (\(\lambda_1 \approx 0, \lambda_2 \approx 0\))

Türevler (değişim) her yönde çok azdır. Elips bir noktadan farksızdır. * Görsel: Boş küme.

Durum 2: Kenar (\(\lambda_1 \gg \lambda_2\) veya tam tersi)

Bir yönde değişim çok büyük (Kenara dik), diğer yönde çok küçüktür (Kenar boyunca). * Görsel: İnce uzun bir elips (Sosis gibi).

Durum 3: Köşe (\(\lambda_1\) ve \(\lambda_2\) BÜYÜK)

Her iki yönde de değişim çok büyüktür. * Görsel: Büyük ve şişman bir daire/elips.

Harris Skor Bölgeleri

Harris Skor Fonksiyonu (R)

Bilgisayarda her piksel için özdeğer (\(\lambda\)) hesaplamak (“Karekök” işlemi gerektirdiği için) maliyetlidir.

Harris, zekice bir matematiksel numara ile özdeğerleri hesaplamadan sonuca ulaşan bir skor fonksiyonu (\(R\)) geliştirmiştir:

\[ R = \det(M) - k \cdot (\text{trace}(M))^2 \]

Burada:

  • \(\det(M) = \lambda_1 \cdot \lambda_2\) (Özdeğerlerin çarpımı)
  • \(\text{trace}(M) = \lambda_1 + \lambda_2\) (Özdeğerlerin toplamı)
  • \(k\): Deneysel bir sabit (Genellikle 0.04 - 0.06 arası)

R Değerinin Yorumu

Matematiksel Karar Mekanizması

  1. Köşe Durumu (Corner): \(\lambda_1\) ve \(\lambda_2\) çok büyük.
    • Çarpımları (\(\det\)) çok çok büyük olur.
    • \(R\) değeri ÇOK BÜYÜK POZİTİF çıkar. ✅
  2. Kenar Durumu (Edge): Biri büyük, biri küçük.
    • Toplamın karesi (\(\text{trace}^2\)) büyük olur ve çıkarıldığı için sonuç negatifleşir.
    • \(R\) değeri NEGATİF çıkar. ➖
  3. Düz Alan (Flat): İkisi de küçük.
    • \(R\) değeri SIFIRA YAKIN çıkar. 🕳️

Harris Köşe Tespiti Akış Şeması

Görsel işleme hattı şöyledir:

  1. Girdi: Gri seviye görüntü.
  2. Türev: Sobel operatörü ile \(I_x\) ve \(I_y\) görüntülerini hesapla.
  3. Çarpım: \(I_x^2\), \(I_y^2\) ve \(I_x I_y\) görüntülerini oluştur.
  4. Gaussian: Bu çarpım görüntülerini Gaussian Blur ile yumuşat (Pencere içindeki toplamı bulmak için). Bu bize her pikselde \(M\) matrisini verir.
  5. Harris Skoru: Her piksel için \(R = \det - k(\text{trace})^2\) formülünü uygula.
  6. Eşikleme: \(R\) değeri belli bir eşikten (Threshold) büyük olan yerleri işaretle.
  7. Non-Maximum Suppression: Birbirine çok yakın köşe kümelerinden sadece en kuvvetlisini al.

Python ile Uygulama (Etkileşimli Deney)

Bu teorik adımlar aşağıdaki Pyodide simülasyonunda görüldüğü gibi tek fonksiyona inmektedir. Pencere boyutunu veya \(k\) sabiti (R eşiği) değerini değiştirerek, düz kenarların yanılgıyla köşe olarak algılanıp algılanmadığını inceleyebilirsiniz:

Gerçek Dünya Kullanım Alanları: Harris Köşe Tespiti

  • Panoramik Görüntü Birleştirme (Image Stitching): Birden fazla fotoğrafın birleştirilmesi için ortak noktalar bulunmalıdır.
  • Slam / Robotik Haritalama: Hareket ederken referans alınan sabit köşe noktalarıyla derinlik/odaları haritalamak.
  • Kamera Kalibrasyonu: Damalı tahta (Chessboard) köşelerinin hassas tespitiyle lens yamulmalarının (distortion) düzeltilmesi.
  • Nesne İzleme (Object Tracking): Bir hedefi (drone vs.) kilitlenip kare kare köşelerini takip etmek.