Bilgisayarlı Görü

Kenar Bulma

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

2025

Kenar Tespiti (Edge Detection) Nedir?

Kenar tespiti, bir görüntüde yoğunluk değişiminin (parlaklık farkının) en belirgin olduğu yerleri bulmak için kullanılan bir tekniktir.

Kenarlar genellikle:

  • Nesne sınırlarını belirler
  • Şekil ve kontur bilgisi sağlar
  • Segmentasyon, nesne tanıma, derinlik analizi gibi birçok işlemin temelidir

Neden Kenar Ararız?

  • Görsel bilgi en çok kenarlarda yoğunlaşır.
  • Düz alanlar ilgi çekici değildir, değişim olan yerler önemlidir.
  • İnsan gözü de benzer şekilde çalışır: dikkat kenarlarda toplanır.

Genel Kenar Tespit Süreci

  1. Görüntü al (genellikle gri tonlamalı)
  2. Gürültü azalt (blur uygula — Gaussian tercih edilir)
  3. Kenar operatörü uygula (Sobel, Prewitt, Canny vb.)
  4. Eşikleme uygula (bazı yöntemlerde)
  5. Sonuç: Kenar haritası

Kenar Tespiti Nasıl Çalışır?

Kenar tespiti, bir görüntüdeki gradyan (yoğunluk değişimi) değerlerini hesaplar:

[ = ]

  • ( ): Yatay değişim (sağ-sol farkı)
  • ( ): Dikey değişim (yukarı-aşağı farkı)

Gradyan ne kadar büyükse → değişim o kadar ani → orada kenar vardır.

Kullanılan Yöntemler

Aşağıdaki başlıca yöntemlerle kenar tespiti yapılır:

Yöntem Açıklama
Sobel Gradyanı x ve y yönünde ayrı hesaplar, kenarları vurgular
Prewitt Sobel’e benzer, daha basit ağırlıklar kullanır
Roberts Kenarları çapraz yönlerde bulur, daha hızlıdır
Laplacian İkinci türev ile kenar bulur, yönsüzdür
Canny Çok aşamalı, en doğru sonuçları veren yöntemdir

Hangisini Ne Zaman Kullanmalı?

Yöntem Avantaj Dezavantaj
Sobel Basit, yönlü Gürültüye duyarlı
Prewitt Daha hızlı Detay kaybı olabilir
Roberts Hızlı ve küçük kernel Gürültü etkisi fazla
Laplacian Yönsüz, keskin tepki Kenar konumu hassas değil
Canny En kaliteli kenar haritası Yavaş, ayar parametreleri çok

Kenar Haritası Nedir?

Kenar tespit operatörleri, görüntü üzerinde kenarların geçtiği yerlerde yüksek değer, diğer yerlerde düşük değer üretir.

Sonuç:
- Kenar → parlak çizgi
- Düz alan → siyah veya koyu gri

Sobel Operatörü Nedir?

Sobel operatörü, bir görüntüdeki kenarları x (yatay) ve y (dikey) yönlerinde tespit eden bir gradyan (eğim) filtresidir.

  • Kenarlar: yoğunluk değişiminin hızlı olduğu yerler
  • Sobel → 1. türev bilgisine dayanır
  • Yönlü kenar tespiti yapar (x veya y doğrultusunda)

Matematiksel Tanım

Gradyan büyüklüğü:

\[ G = \sqrt{G_x^2 + G_y^2} \]

Yaklaşık olarak:

\[ G \approx |G_x| + |G_y| \]

  • ( G_x ): X yönündeki gradyan (sağ-sol fark)
  • ( G_y ): Y yönündeki gradyan (yukarı-aşağı fark)

Sobel Çekirdekleri (Kernels)

X Yönü için Sobel:

\[ G_x = \begin{bmatrix} -1 & 0 & 1 \\\\ -2 & 0 & 2 \\\\ -1 & 0 & 1 \end{bmatrix} \]

Y Yönü için Sobel:

\[ G_y = \begin{bmatrix} -1 & -2 & -1 \\\\ 0 & 0 & 0 \\\\ 1 & 2 & 1 \end{bmatrix} \]

Ne Yapıyor Bu Çekirdekler?

  • ( G_x ): sağ-sol farkları hesaplar → dikey kenarları bulur
  • ( G_y ): yukarı-aşağı farkları hesaplar → yatay kenarları bulur

Her piksel için bu çekirdekler ile konvolüsyon yapılır, ardından büyüklük/yoğunluk hesaplanır.

Sobel Operatörünün Özellikleri

Özellik Açıklama
Türev 1. türev kullanılır
Yön bilgisi X ve Y ayrı ayrı
Gürültüye duyarlılık Orta düzey
Hesaplama maliyeti Düşük
Kenar hassasiyeti Orta
Filtre boyutu Genellikle 3×3

Neden Sobel?

  • Gaussian ile yumuşatılmış gibi davranır → Gürültüye doğrudan duyarlı değildir
  • Kenar tespiti öncesi ekstra blur şart değildir (ama önerilir)
  • Yönlü bilgi sağlar → kenar yönü analizi yapılabilir

Görsel Etki

  • ( G_x ): dikey çizgileri belirginleştirir
  • ( G_y ): yatay çizgileri belirginleştirir
  • ( G = |G_x| + |G_y| ): tam kenar haritası verir

Sobel Operatörü – Net Kenar Örneği

Bu örnekte, sol taraf karanlık (10), sağ taraf parlak (100) → dikey kenar var.

🎯 Giriş Görüntüsü:

\[ A = \begin{bmatrix} 10 & 10 & 100 \\ 10 & 10 & 100 \\ 10 & 10 & 100 \end{bmatrix} \]

Sobel X ve Y Çekirdekleri

\[ G_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} \quad G_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} \]

Adım 1: \[G_x\] Hesaplaması (dikey kenar vurgusu)

\[ G_x = (-1 \cdot 10) + (0 \cdot 10) + (1 \cdot 100) \\ + (-2 \cdot 10) + (0 \cdot 10) + (2 \cdot 100) \\ + (-1 \cdot 10) + (0 \cdot 10) + (1 \cdot 100) \]

\[ G_x = (-10 + 0 + 100) + (-20 + 0 + 200) + (-10 + 0 + 100) = 90 + 180 + 90 = 360 \]

Adım 2: ( G_y ) Hesaplaması (yatay kenar kontrolü)

\[ G_y = (-1 \cdot 10) + (-2 \cdot 10) + (-1 \cdot 100) \\ + (0 \cdot 10) + (0 \cdot 10) + (0 \cdot 100) \\ + (1 \cdot 10) + (2 \cdot 10) + (1 \cdot 100) \]

\[ G_y = (-10 -20 -100) + (0 + 0 + 0) + (10 + 20 + 100) = -130 + 0 + 130 = 0 \]

Gradyan Büyüklüğü

\[ G = \sqrt{G_x^2 + G_y^2} = \sqrt{360^2 + 0^2} = 360 \]

  • Dikey kenar çok belirgin → yüksek gradyan değeri
  • Yatay fark yok → ( G_y = 0 )

Sonuç

Bu örnekte Sobel operatörü başarılı şekilde dikey kenarı algıladı.

  • Eğer yalnızca ( G_x ) kullanılırsa → dikey kenarlar bulunur
  • Tüm kenarları görmek için ( |G_x| + |G_y| ) veya ( ) kullanılabilir

OpenCV Örnek


import cv2
import numpy as np
import matplotlib.pyplot as plt

image_path = "../assets/images/lena.jpeg"

image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

sobel_combined = cv2.magnitude(sobel_x, sobel_y)

sobel_x_disp = cv2.convertScaleAbs(sobel_x)
sobel_y_disp = cv2.convertScaleAbs(sobel_y)
sobel_combined_disp = cv2.convertScaleAbs(sobel_combined)

fig, axs = plt.subplots(1, 4, figsize=(16, 4))

axs[0].imshow(image, cmap='gray')
axs[0].set_title("Orijinal Görüntü")
axs[0].axis("off")

axs[1].imshow(sobel_x_disp, cmap='gray')
axs[1].set_title("Sobel X")
axs[1].axis("off")

axs[2].imshow(sobel_y_disp, cmap='gray')
axs[2].set_title("Sobel Y")
axs[2].axis("off")

axs[3].imshow(sobel_combined_disp, cmap='gray')
axs[3].set_title("Sobel Kenar Haritası")
axs[3].axis("off")

plt.tight_layout()
plt.show()

Sobel Örnek Uygulama

Roberts Cross Operatörü

Roberts operatörü, kenar tespiti için kullanılan en eski yöntemlerden biridir.

  • Küçük boyutlu (2×2) çekirdek (kernel) kullanır
  • Hızlıdır ve uygulaması kolaydır
  • Kenarları çapraz yönlerde (diyagonal) algılar

Temel Fikir

  • Bir pikselin sağ alt komşusu ile sol üst komşusu arasındaki fark alınır
  • Böylece çapraz yönlü yoğunluk değişimi ölçülür

🔧 Roberts Çekirdekleri

X yönü (diyagonal 1):

\[ G_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \]

Y yönü (diyagonal 2):

\[ G_y = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} \]

Gradyan Hesabı

Roberts gradyanı şöyle hesaplanır:

\[ G = \sqrt{G_x^2 + G_y^2} \quad \text{veya} \quad G \approx |G_x| + |G_y| \]

  • ( G_x ): sol üst – sağ alt farkı
  • ( G_y ): sağ üst – sol alt farkı

Avantajları ve Dezavantajları

Özellik Açıklama
✔ Basit 2×2 çekirdek → çok hızlı uygulanır
✔ Kenar algısı Kenarları erken yakalar (ani değişime hassas)
✖ Gürültüye duyarlı Blur öncesi uygulanırsa gürültü de kenar sanılabilir
✖ Detay kaybı Küçük kernel → çok dar algı aralığı

Not

Roberts Cross Operatörü, modern uygulamalarda nadiren tek başına kullanılır. Ancak:

  • Basit donanımlarda
  • Eğitim amaçlı gösterimlerde
  • Ya da gerçek zamanlı (ultra-hafif) sistemlerde tercih edilebilir.

Görsel Etkisi

  • Kenarlar köşesel ve diyagonal olarak algılanır
  • Net köşe kırılmalarında iyi çalışır
  • Genellikle Gaussian blur ile birlikte uygulanması önerilir

Roberts Örnek Uygulama

Canny Kenar Algılama

  • Canny algoritması, çok adımlı ve gürültüye karşı dayanıklı bir kenar algılama tekniğidir.

  • 1986’da John F. Canny tarafından geliştirilmiştir.

Canny’nin Amaçları

  1. İyi kenar tespiti (gerçek kenarlar bulunmalı)
  2. Hassasiyet (kenar yeri doğru olmalı)
  3. Tek yanıt (aynı kenar için birden fazla çizgi olmamalı)

Canny Kenar Tespiti Aşamaları

  1. Gürültü Giderme (Gaussian Blur)
    • Görüntü yumuşatılır → küçük gürültüler engellenir
  2. Gradyan Hesaplama (Sobel X ve Y)
    • Kenar yönü ve büyüklüğü hesaplanır
  3. Non-Maximum Suppression
    • Gradyan yönüne göre, en güçlü kenar korunur
    • Çevresine göre zayıf olan kenarlar bastırılır
  1. Çift Eşikleme (Double Thresholding)
    • Yüksek eşik → kesin kenar
    • Düşük eşik → zayıf ama olası kenar
  2. Hysteresis
    • Zayıf kenarlar, güçlü kenarlara bağlıysa korunur
    • Diğerleri atılır

Görsel Akış

flowchart LR
  A[Gaussian Blur] --> B(Gradyan Hesabı - Sobel)
  B --> C[Non-Maximum Suppression]
  C --> D[Double Thresholding]
  D --> E[Hysteresis]
  E --> F[Kenar Haritası]

Morfolojik İşlemler

  • Morfolojik işlemler, genellikle binary görüntü üzerinde uygulanan şekle bağlı işlemlerdir.
  • Tüm morfolojik işlemler temelde iki bileşene ihtiyaç duyar
    • Binary görüntü
    • Yapısal çekirdek (görüntü üzerinde kaydırmak için)
  • Morfolojik işlemleri aşağıdaki amaçlar için kullanabiliriz.
    • Nesnelerin boyutunu arttırmak veya azaltmak,
    • Nesneler arasındaki boşlukları kapatmak veya açmak

Morfolojik İşlem Türleri

  1. Erosion (Aşındırma)
    → Nesneleri küçültür, ince kenarları yok eder

  2. Dilation (Genleşme)
    → Nesneleri büyütür, boşlukları kapatır

  3. Opening (Açma) = Erosion → Dilation
    → Gürültü temizleme

  4. Closing (Kapama) = Dilation → Erosion
    → Boşluk kapatma, kontur tamamlama

  5. Boundary Extraction, Gradient, Top-Hat, Black-Hat
    → Daha ileri seviye işlemler

Erosion (Aşındırma)

  • Erosion, bir nesnenin sınırlarını aşındıran, yani beyaz (1) pikselleri küçülten morfolojik işlemdir.
  • Ön plandaki görüntünün dış sınırlarını inceltir.
  • Yapısal eleman (kernel) görüntü üzerinde gezdirilir
  • Kernel altındaki tüm değerler 1 ise, merkez piksel 1 olarak kalır. Aksi halde 0 yapılır
  • İnceltme miktarı kullanılılan çekirdeğin boyutuna ve şekline göre değişir.

Ne işe yarar?

  • Gürültü giderme (küçük beyaz pikseller silinir)
  • Nesneleri inceltme
  • Kenar yumuşatma
  • Yakın nesneleri ayırma

Yapısal Eleman (Structuring Element)

Genellikle 3×3 boyutundadır:

\[ SE = \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]

  • Tüm komşuluk kontrol edilir

Örnek Giriş Matrisi (5×5 Binary)

\[ A = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

Erosion Sonucu

Sadece içte kalan pikseller 1 kalır:

\[ Erosion(A) = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 1 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

  • Kenarlardaki 1’ler silindi
  • Sadece merkeze yakın olanlar kaldı

Notlar

  • Erosion çoklu olarak olarak uygulanabilir. Erode edilmiş görüntü üzerinden tekrar tekrar uygulandığından görüntü ön planı giderek incelir.
  • Genellikle önce dilation ile birlikte (opening veya closing) kullanılır

Dilation (Genleşme)

  • Dilation, nesne sınırlarını dışa doğru genişleten bir morfolojik işlemdir.
  • Temelde erosion un tersi şekilde çalışır
  • Görüntüdeki beyaz (1) pikselleri büyütür
  • Yapısal eleman (kernel), görüntüde kaydırılır
  • Kernel ile örtüşen herhangi bir 1 varsa, merkez piksel 1 yapılır

Ne işe yarar?

  • Küçük boşlukları kapatma
  • Nesneleri genişletme
  • Kopuk kenarları birleştirme
  • Nesne konturlarını kalınlaştırma

Yapısal Eleman (Structuring Element)

Genellikle 3×3 boyutundadır:

\[ SE = \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]

Örnek Giriş Matrisi (5×5 Binary)

\[ A = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 1 & 0 & 0 \\\\ 0 & 0 & 1 & 0 & 0 \\\\ 0 & 0 & 1 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

Dilation Sonucu

\[ Dilation(A) = \begin{bmatrix} 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \end{bmatrix} \]

  • Beyaz çizgi (1 sütunu) genişledi
  • Komşulukta en az bir 1 varsa → merkez piksel 1 oldu

Notlar

  • Erosion’un tersidir: Dilation genişletir, Erosion küçültür
  • Gürültülü görüntülerde dikkatli kullanılmalıdır
  • Özellikle Closing ve Morph. Gradient gibi işlemlerde kullanılır

Opening (Açma)

  • Opening, sırasıyla Erosion → Dilation işlemlerinin ardışık uygulanmasıdır.

  • İlk olarak küçük gürültüler temizlenir (Erosion)

  • Sonra şeklin orijinal boyutu geri kazanılır (Dilation)

Ne işe yarar?

  • Tuz ve karabiber gürültüsü gibi küçük nesneleri temizler
  • Nesne şekli bozulmadan, gereksiz küçük alanları siler
  • Gürültülü segmentasyon çıktıları için idealdir

Açma İşlem Akışı

flowchart LR
  A[Orijinal Görüntü] --> B(Erosion)
  B --> C[NDilation]

Örnek Giriş Matrisi

\[ A = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\\\ 1 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 1 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 1 & 0 & 0 & 0 & 0 \end{bmatrix} \]

Erosion sonrası \[ A = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 1 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

Opening Sonucu

\[ Opening(A) = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

  • Küçük 1’ler temizlendi
  • Ortadaki ana nesne korundu

Notlar

  • Erosion ile küçük yapılar silinir
  • Dilation ile ana şeklin boyutu toparlanır
  • Eğer nesne çok küçükse tamamen silinebilir → dikkatli kullanılmalı

Closing (Kapama)

  • Closing, sırasıyla Dilation → Erosion işlemlerinin ardışık uygulanmasıdır.

  • İlk olarak nesneler genişletilir (Dilation)

  • Ardından yeniden daraltılır (Erosion)

  • Amaç: iç boşlukları doldurmak, nesne bütünlüğünü sağlamak

Ne işe yarar?

  • Küçük siyah delikleri kapatır
  • Nesne konturlarını düzleştirir
  • İnce boşlukları giderir
  • Segmentasyon sonrası nesne birleştirme için kullanılır

Kapama İşlem Akışı

flowchart LR
  A[Orijinal Görüntü] --> B(Dilation)
  B --> C[Erosion]

Yapısal Eleman (Structuring Element)

Genellikle 3×3 boyutundadır:

\[ SE = \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]

Örnek Giriş Matrisi

\[ A = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 0 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

  • Ortada küçük bir iç boşluk (0) var

Closing Sonucu

\[ Closing(A) = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 1 & 1 & 1 & 0 \\\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

  • Ortadaki boşluk dolduruldu
  • Ana şeklin sınırları korundu

Notlar

  • Opening → küçük nesneleri siler
  • Closing → küçük boşlukları doldurur
  • Segmentasyon sonrası nesneleri birleştirmek için çok kullanışlıdır

Morfolojik Gradient

  • Morfolojik gradient dilation ve erosion farkından oluşmaktadır.

\[ \text{Gradient}(A) = \text{Dilation}(A) - \text{Erosion}(A) \]

Ne işe yarar?

  • Nesnelerin kenar çizgilerini ortaya çıkarır
  • Kenar tespiti (edge detection) için hızlı ve etkili bir yöntemdir
  • Segmentasyon öncesi kullanılabilir
  • Hem iç hem dış sınırlara duyarlıdır

Örnek Giriş Matrisi

\[ A = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

Dilation(A)

\[ \begin{bmatrix} 0 & 1 & 1 & 1 & 0 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 1 & 0 \end{bmatrix} \]

Erosion(A)

\[ \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 1 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]

Gradient(A) = Dilation - Erosion

\[ \begin{bmatrix} 0 & 1 & 1 & 1 & 0 \\ 1 & 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 0 & 1 \\ 1 & 1 & 0 & 1 & 1 \\ 0 & 1 & 1 & 1 & 0 \end{bmatrix} \]

  • Sadece sınırlarda yüksek değerler kaldı
  • Merkezdeki sabit bölgeler silindi

Avantajları

  • Hızlı ve uygulanması kolaydır
  • Canny gibi karmaşık kenar bulma algoritmalarına göre basittir
  • Küçük nesnelerde sınırlı etkilidir, ancak belirgin nesne kenarlarında oldukça iyidir

Not

  • Çıktı görüntü kenar kalınlığı açısından 1 piksel genişliğinde olur
  • Genellikle önceden threshold uygulanmış (binary) görüntülerde daha net sonuç verir