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ı]
Kenar Bulma
2025
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:
Kenar tespiti, bir görüntüdeki gradyan (yoğunluk değişimi) değerlerini hesaplar:
[ = ]
Gradyan ne kadar büyükse → değişim o kadar ani → orada kenar vardır.
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 |
| 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 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ü, bir görüntüdeki kenarları x (yatay) ve y (dikey) yönlerinde tespit eden bir gradyan (eğim) filtresidir.
Gradyan büyüklüğü:
\[ G = \sqrt{G_x^2 + G_y^2} \]
Yaklaşık olarak:
\[ G \approx |G_x| + |G_y| \]
\[ G_x = \begin{bmatrix} -1 & 0 & 1 \\\\ -2 & 0 & 2 \\\\ -1 & 0 & 1 \end{bmatrix} \]
\[ G_y = \begin{bmatrix} -1 & -2 & -1 \\\\ 0 & 0 & 0 \\\\ 1 & 2 & 1 \end{bmatrix} \]
Her piksel için bu çekirdekler ile konvolüsyon yapılır, ardından büyüklük/yoğunluk hesaplanır.
| Ö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 |
Bu örnekte, sol taraf karanlık (10), sağ taraf parlak (100) → dikey kenar var.
\[ A = \begin{bmatrix} 10 & 10 & 100 \\ 10 & 10 & 100 \\ 10 & 10 & 100 \end{bmatrix} \]
\[ 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} \]
\[ 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 \]
\[ 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 \]
\[ G = \sqrt{G_x^2 + G_y^2} = \sqrt{360^2 + 0^2} = 360 \]
Bu örnekte Sobel operatörü başarılı şekilde dikey kenarı algıladı.
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()Roberts operatörü, kenar tespiti için kullanılan en eski yöntemlerden biridir.
\[ G_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \]
\[ G_y = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} \]
Roberts gradyanı şöyle hesaplanır:
\[ G = \sqrt{G_x^2 + G_y^2} \quad \text{veya} \quad G \approx |G_x| + |G_y| \]
| Ö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ığı |
Roberts Cross Operatörü, modern uygulamalarda nadiren tek başına kullanılır. Ancak:
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.
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ı]
Erosion (Aşındırma)
→ Nesneleri küçültür, ince kenarları yok eder
Dilation (Genleşme)
→ Nesneleri büyütür, boşlukları kapatır
Opening (Açma) = Erosion → Dilation
→ Gürültü temizleme
Closing (Kapama) = Dilation → Erosion
→ Boşluk kapatma, kontur tamamlama
Boundary Extraction, Gradient, Top-Hat, Black-Hat
→ Daha ileri seviye işlemler
Genellikle 3×3 boyutundadır:
\[ SE = \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]
\[ 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} \]
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} \]
Genellikle 3×3 boyutundadır:
\[ SE = \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]
\[ 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(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} \]
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)
flowchart LR A[Orijinal Görüntü] --> B(Erosion) B --> C[NDilation]
\[ 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(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} \]
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
flowchart LR A[Orijinal Görüntü] --> B(Dilation) B --> C[Erosion]
Genellikle 3×3 boyutundadır:
\[ SE = \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]
\[ 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} \]
\[ 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} \]
\[ \text{Gradient}(A) = \text{Dilation}(A) - \text{Erosion}(A) \]
\[ 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} \]
\[ \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} \]
\[ \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} \]
\[ \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} \]
Bilgisayarla Görü – OMÜ | 🏠