· Hakan Çelik · OpenCV / Görüntü İşleme · 4 dk okuma
Hough Doğru Dönüşümü

OpenCV Serisi 21/64
- 1. Boya Fırçası Olarak Fare
- 2. Canny Kenar Algılama
- 3. Görüntü Geçişleri
- 4. Görüntü Piramitleri
- 5. Görüntülerde Aritmetik İşlemler
- 6. Görüntülerle İlgili Temel İşlemler
- 7. Görüntünün Geometrik Dönüşümleri
- 8. Görüntüyü Yumuşatma - ( Smoothing Images )
- 9. Histogramlar
- 10. Konturler ( Contours )
- 11. Morfolojik Dönüşümler
- 12. Opencv Nedir Ve Kurulumu
- 13. Opencv Resim Işlemleri
- 14. Opencv Video Işlemleri
- 15. Opencv'de Çizim Fonksiyonları
- 16. Performans Ölçüm Ve Geliştirme Teknikleri
- 17. Renk Alanlarını Değiştirme
- 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
- 19. Resim Eşikleme
- 20. Şablon Eşleştirme
- 21. Hough Doğru Dönüşümü
- 22. Hough Daire Dönüşümü
- 23. Fourier Dönüşümü
- 24. Histogram Eşitleme
- 25. 2B Histogramlar
- 26. Histogram Geri Projeksiyonu
- 27. Kontur Özellikleri
- 28. Kontur Nitelikleri
- 29. Konturlerle Daha Fazla İşlev
- 30. Kontur Hiyerarşisi
- 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
- 32. Watershed Algoritması ile Görüntü Segmentasyonu
- 33. Özellikleri Anlamak
- 34. Harris Köşe Tespiti
- 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
- 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
- 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
- 38. Köşe Tespiti için FAST Algoritması
- 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
- 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
- 41. Özellik Eşleştirme
- 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
- 43. Meanshift ve Camshift ile Nesne Takibi
- 44. Optik Akış
- 45. Arka Plan Çıkarma
- 46. Kamera Kalibrasyonu
- 47. Poz Tahmini
- 48. Epipolar Geometri
- 49. Stereo Görüntülerden Derinlik Haritası
- 50. k-En Yakın Komşuyu Anlamak
- 51. kNN ile El Yazısı OCR
- 52. SVM'yi Anlamak
- 53. SVM ile El Yazısı OCR
- 54. K-Ortalamalar Kümeleme'yi Anlamak
- 55. OpenCV'de K-Ortalamalar Kümeleme
- 56. Görüntü Gürültü Giderme
- 57. Görüntü Onarımı (Inpainting)
- 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
- 59. Haar Cascade ile Yüz Tespiti
- 60. pip ile OpenCV Kurulumu
- 61. Ubuntu'da OpenCV-Python Kurulumu
- 62. Fedora'da OpenCV-Python Kurulumu
- 63. Windows'ta OpenCV-Python Kurulumu
- 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?
Hough Doğru Dönüşümü
Hedefler
Bu bölümde öğrenecekleriniz:
- Hough Dönüşümü kavramını anlamak
- Bir görüntüdeki doğruları tespit etmek için kullanmak
- Şu fonksiyonları göreceksiniz:
cv2.HoughLines(),cv2.HoughLinesP()
Teori
Hough Dönüşümü, matematiksel olarak ifade edilebilen herhangi bir şekli tespit etmek için kullanılan popüler bir tekniktir. Şekil biraz bozuk veya kırık olsa bile tespit edebilir. Nasıl çalıştığını doğrular üzerinden görelim.
Bir doğru y = mx + c şeklinde ya da parametrik biçimde şöyle ifade edilebilir:
ρ = x·cos(θ) + y·sin(θ)
Burada ρ orijinden doğruya olan dik uzaklık, θ ise bu dik çizgi ile yatay eksen arasındaki açıdır (saat yönünün tersine ölçülür). Aşağıdaki görüntüye bakın:
Eğer doğru orijinin altından geçiyorsa ρ pozitif ve açı 180 dereceden küçük olur. Orijinin üzerinden geçiyorsa 180 dereceden büyük açı almak yerine açı 180 dereceden küçük alınır ve ρ negatif yapılır. Dikey doğrular 0 dereceye, yatay doğrular ise 90 dereceye sahip olur.
Şimdi Hough Dönüşümü’nün doğrular için nasıl çalıştığını görelim. Her doğru bu iki terimle (ρ, θ) ifade edilebilir. İlk olarak iki parametrenin değerlerini tutmak için 2B bir dizi (akümülatör) oluşturulur ve başlangıçta 0’a ayarlanır. Satırlar ρ’yi, sütunlar θ’yı temsil eder. Dizinin boyutu ihtiyaç duyulan doğruluğa göre belirlenir. Örneğin açı doğruluğu 1 derece olmasını istiyorsanız 180 sütuna ihtiyacınız vardır.
Ortada yatay bir çizgi olan 100×100’lük bir görüntüyü düşünün. Çizginin ilk noktasını alın. (x, y) değerlerini biliyorsunuz. Şimdi doğru denkleminde θ = 0, 1, 2, ..., 180 değerlerini koyun ve elde ettiğiniz ρ değerini kontrol edin. Her (ρ, θ) çifti için akümülatörde karşılık gelen (ρ, θ) hücresini bir artırın.
Bu işlemi çizgi üzerindeki tüm noktalar için sürdürün. Her noktada (50, 90) hücresi artırılacak ve sonunda en fazla oyu o hücre alacaktır. Akümülatörde en fazla oyu ararsanız (50, 90) değerini bulursunuz; bu görüntüde orijinden 50 piksel uzakta ve 90 derecede bir doğru olduğunu söyler. Aşağıdaki animasyon bunu açıkça göstermektedir:

Akümülatör görüntüsü aşağıdadır. Bazı konumlardaki parlak noktalar, görüntüdeki olası doğruların parametrelerini gösterir:

OpenCV’de Hough Dönüşümü
Yukarıda açıklanan her şey OpenCV’nin cv2.HoughLines() fonksiyonunda yer almaktadır. Bu fonksiyon (ρ, θ) değerlerinden oluşan bir dizi döndürür. ρ piksel cinsinden, θ ise radyan cinsinden ölçülür.
- 1. parametre: Girdi görüntüsü — ikili (binary) görüntü olmalıdır; bu nedenle Hough dönüşümü uygulamadan önce eşikleme veya Canny kenar tespiti yapın.
- 2. ve 3. parametreler: Sırasıyla
ρveθdoğrulukları. - 4. parametre (threshold): Bir doğru olarak kabul edilmesi için gereken minimum oy sayısı. Oy sayısı doğru üzerindeki nokta sayısına bağlıdır; bu yüzden tespit edilmesi gereken minimum doğru uzunluğunu temsil eder.
import cv2 as cv
import numpy as np
img = cv.imread('sudoku.png')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3)
lines = cv.HoughLines(edges, 1, np.pi / 180, 200)
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv.imwrite('houghlines3.jpg', img)Sonuçlara bakın:

Olasılıksal Hough Dönüşümü (Probabilistic Hough Transform)
Klasik Hough Dönüşümünde, yalnızca iki argümanlı bir doğru için bile çok fazla hesaplama gerekir. Olasılıksal Hough Dönüşümü bu işlemin optimize edilmiş halidir. Tüm noktaları dikkate almak yerine, doğru tespiti için yeterli olan rastgele bir nokta alt kümesi alır. Eşik değerini azaltmak yeterlidir. Aşağıdaki görüntü, Hough Dönüşümü ile Olasılıksal Hough Dönüşümünü Hough uzayında karşılaştırmaktadır:

OpenCV uygulaması Matas, Galambos ve Kittler’ın Kademeli Olasılıksal Hough Dönüşümü makalesine dayanmaktadır. Kullanılan fonksiyon cv2.HoughLinesP()’dir. İki yeni argümana sahiptir:
- minLineLength: Minimum doğru uzunluğu. Bundan kısa doğru parçaları reddedilir.
- maxLineGap: Tek bir doğru olarak değerlendirilebilmesi için doğru parçaları arasındaki maksimum boşluk.
En güzel yanı doğruların iki uç noktasını doğrudan döndürmesidir. Önceki durumda yalnızca doğrunun parametrelerini alıyordunuz ve tüm noktaları kendiniz bulmak zorundaydınız. Burada her şey doğrudan ve basittir:
import cv2 as cv
import numpy as np
img = cv.imread('sudoku.png')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3)
lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=100, maxLineGap=10)
for line in lines:
x1, y1, x2, y2 = line[0]
cv.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv.imwrite('houghlines5.jpg', img)Sonuçlara bakın:

Hakan Çelik


