Bulanıklaştırma ve Keskinleştirme
2026


Blurring işlemi, görüntü \(f(x,y)\) üzerinde bir filtre \(k(i,j)\) ile konvolüsyon yapılmasıyla elde edilir:
\[ g(x,y) = \sum_{i=-m}^{m} \sum_{j=-n}^{n} f(x+i, y+j) \cdot k(i,j) \]
Burada:
\[ g(x, y) = \sum_{i=-1}^{1} \sum_{j=-1}^{1} f(x+i, y+j) \cdot k(i, j) \]
Burada:
Kullanılan 3×3 Ortalama (Box) Filtresi:
\[ k = \frac{1}{9} \times \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]
Ortalama (Mean) filtre, tüm komşu piksellere eşit ağırlık verir. Bu durum:
Çözüm:
Örnek 3×3 Gaussian Çekirdeği (σ ≈ 1.0):
\[ k = \frac{1}{16} \times \begin{bmatrix} 1 & 2 & 1 \\\\ 2 & 4 & 2 \\\\ 1 & 2 & 1 \end{bmatrix} \]
Her pikseli, kendi komşuluk bölgesindeki medyan değeri ile değiştirir.
Özellikle tuz ve karabiber gürültüsü (salt-and-pepper noise) gibi ani parlaklık değişimlerine karşı çok etkilidir.
Kenarları daha iyi korur.
Giriş 3×3 bölgesi:
\[ \begin{bmatrix} 10 & 20 & 30 \\\\ 20 & 255 & 40 \\\\ 30 & 40 & 50 \end{bmatrix} \]
\[ [10,\; 20,\; 30,\; 20,\; 255,\; 40,\; 30,\; 40,\; 50] \]
\[ [10,\; 20,\; 20,\; 30,\; 30,\; 40,\; 40,\; 50,\; 255] \]
\[ \text{Median} = 30 \]
Örnek:
Giriş 3×3 bölgesi:
\[ \begin{bmatrix} 10 & 20 & 30 \\\\ 20 & 255 & 40 \\\\ 30 & 40 & 50 \end{bmatrix} \]
Bilateral filtreleme, görüntüyü yumuşatırken kenarları koruyan özel bir blur tekniğidir.
Hem konuma hem de parlaklık benzerliğine göre ağırlıklandırma yapar.
\[ I'(p) = \frac{1}{W_p} \sum_{q \in \Omega} I(q) \cdot G_s(\|p - q\|) \cdot G_r(|I(p) - I(q)|) \]
Burada:
\[ G_s(d) = e^{- \frac{d^2}{2 \sigma_s^2}} \]
\[ G_r(\Delta I) = e^{- \frac{(I(p)-I(q))^2}{2 \sigma_r^2}} \]
Bilateral filtre, bir pikselin yeni değerini belirlerken komşularının “fikrini” alır. Ancak her komşuya eşit söz hakkı vermez:
Sonuç: Kenarın diğer tarafındaki pikseller (farklı renkte olanlar) komitede olsalar bile fikirleri (ağırlıkları) çok düşük olduğu için sonucu etkileyemezler. Bu yüzden kenarlar korunur.
Instagram/Snapchat/TikTok Filtreleri ve Bilateral Filtre
Her gün onlarca insanın kullandığı ‘güzellik filtrelerini’ düşünün. Bu filtreler yüzünüzü pürüzsüzleştirirken gözlerinizi, dudaklarınızı ve saç tellerinizi nasıl keskin tutuyor? İşte bu, Bilateral Filtre’nin mükemmel bir örneğidir! Filtre, cildiniz gibi düşük detaylı ve tek renkli bölgeleri (bunlar birbirine ‘benzeyen’ piksellerdir) yoğun bir şekilde bulanıklaştırır, ancak göz ve dudak kenarları gibi yüksek kontrastlı yerlere (birbirine ‘benzemeyen’ pikseller) dokunmaz.
Otonom Araçlar
Örnek (Yumuşatma): “Tesla gibi otonom bir aracın kamerasından gelen görüntünün gürültülü olduğunu düşünün. Araç, şerit çizgilerini veya bir yayayı tespit etmeden önce, bu gürültüyü Gauss filtresi ile temizlemek zorundadır. Yani bu basit bulanıklaştırma işlemi, kelimenin tam anlamıyla hayat kurtaran bir ön işleme adımıdır.
Tıbbi Görüntüleme
Bir doktor, bir MR görüntüsündeki tümörün sınırlarını net olarak görmek istediğinde ne yapar? Tıpkı bizim öğrendiğimiz gibi, Unsharp Masking veya benzeri bir keskinleştirme tekniği kullanarak kenarları belirginleştirir. Doğru teşhis koymasına yardımcı olan şey, bu derste öğrendiğimiz temel prensiplerdir.
Örnek: “NASA, James Webb teleskobuyla çektiği galaksi fotoğraflarını yayınladığında gördüğümüz o inanılmaz detaylar aslında bi işleme sürecinin sonucudur. O görüntülerin ham hali genellikle daha az etkileyicidir. Görüntü işleme uzmanları, High-Boost Filtering gibi teknikler kullanarak yıldızları daha parlak, gaz bulutlarının kenarlarını daha keskin hale getirir.
Örnek 5×5 Giriş Matrisi
\[ A = \begin{bmatrix} 10 & 10 & 10 & 10 & 10 \\\\ 10 & 50 & 50 & 50 & 10 \\\\ 10 & 50 & 100 & 50 & 10 \\\\ 10 & 50 & 50 & 50 & 10 \\\\ 10 & 10 & 10 & 10 & 10 \end{bmatrix} \]
Kullanılan 3×3 Ortalama (Box) filtresi:
\[ k = \frac{1}{9} \times \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & 1 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]
Her piksel, 3×3 bölgesinin aritmetik ortalaması ile değiştirilir.
Örnek hesaplama (Merkez Piksel - (2,2)):
\[ g(2,2) = \frac{1}{9} (50 + 50 + 50 + 50 + 100 + 50 + 50 + 50 + 50) = \frac{500}{9} \approx 56 \]
(Ortadaki 100 değeri ortalama alındığı için düşer.)
Kullanılan 3×3 Gaussian filtresi:
\[ k = \frac{1}{16} \times \begin{bmatrix} 1 & 2 & 1 \\\\ 2 & 4 & 2 \\\\ 1 & 2 & 1 \end{bmatrix} \]
Örnek hesaplama (Merkez Piksel - (2,2)):
\[ g(2,2) = \frac{1}{16} (50 \times 1 + 50 \times 2 + 50 \times 1 + 50 \times 2 + 100 \times 4 + 50 \times 2 + 50 \times 1 + 50 \times 2 + 50 \times 1) \]
\[ = \frac{1}{16} (50 + 100 + 50 + 100 + 400 + 100 + 50 + 100 + 50) \]
\[ = \frac{1000}{16} = 62.5 \]
Gaussian ortalamayı ağırlıklı aldığı için merkez değeri (100) biraz daha etkili olur.
Merkez piksel için (2,2) çevresindeki değerler:
\[ [50, 50, 50, 50, 100, 50, 50, 50, 50] \]
Sıralandığında:
\[ [50, 50, 50, 50, 50, 50, 50, 50, 100] \]
Medyan değer: 50
Yani:
\[ g(2,2) = 50 \]
Median filtre, parlak pikseli baskılayarak etraftaki orta değer (50) ile değiştirir.
PSNR (Peak Signal-to-Noise Ratio) değerleri ile orjinal görsele göre karşılaştırma yaparsak:
| Filtre Türü | PSNR Değeri (dB) |
|---|---|
| Mean Blur | 33.73 dB |
| Gaussian Blur | 34.59 dB |
| Median Blur | 35.48 dB |
import cv2
import numpy as np
import matplotlib.pyplot as plt
# PSNR hesaplama fonksiyonu
def compute_psnr(original, processed):
mse = np.mean((original - processed) ** 2)
if mse == 0:
return float('inf') # Görüntüler tamamen aynıysa
PIXEL_MAX = 255.0
return 20 * np.log10(PIXEL_MAX / np.sqrt(mse))
# Görüntüyü gri tonlamalı oku
img = cv2.imread('../assets/images/lena.jpeg', cv2.IMREAD_GRAYSCALE)
# Mean, Gaussian, Median Blur
mean_blur = cv2.blur(img, (3, 3))
gaussian_blur = cv2.GaussianBlur(img, (3, 3), 0)
median_blur = cv2.medianBlur(img, 3)
# PSNR hesapla
psnr_mean = compute_psnr(img, mean_blur)
psnr_gaussian = compute_psnr(img, gaussian_blur)
psnr_median = compute_psnr(img, median_blur)
# Sonuçları yazdır
print(f"PSNR (Mean): {psnr_mean:.2f} dB")
print(f"PSNR (Gaussian): {psnr_gaussian:.2f} dB")
print(f"PSNR (Median): {psnr_median:.2f} dB")| Filtre Türü | Gerçek Dünya Uygulaması |
|---|---|
| Mean Blur | Basit fotoğraf yumuşatma, eski taranmış belgelerde arka plan temizliği |
| Gaussian Blur | Fotoğraf makinesi yazılımlarında lens bulanıklığı simülasyonu |
| Median Blur | Tuz ve karabiber gürültüsüne maruz kalmış tıbbi görüntülerin temizlenmesi |
| Bilateral Filter | Portre fotoğrafçılığında yüz üzerindeki detaylı noise azaltımı |
Keskinleştirme, yumuşatmanın tam tersidir ve Yüksek Geçiren Filtre mantığıyla çalışır.
Yüksek frekanslı bileşenleri (kenarlar, detaylar) vurgular veya geçirir.
Bu işlem matematiksel olarak, görüntüden onun bulanıklaştırılmış bir versiyonunun çıkarılmasıyla elde edilir:
Detay (Maske) = Orijinal Görüntü − Bulanık Görüntü
\(\text{HighPass}(f) = f - \text{LowPass}(f)\)
\[ \begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix} \]
| Uygulama | Açıklama |
|---|---|
| Medikal görüntüleme | Lezyon/sınır belirginleştirme |
| Uydu görüntüleri | Yüzey detaylarını öne çıkarma |
| OCR | Yazı kenarlarını netleştirme |
| Genel görüntü iyileştirme | Kontrastı ve algıyı artırma |
Gürültülü görüntülerde gürültüyü de keskinleştirir
Genellikle önce gürültü filtreleme, sonra keskinleştirme önerilir
Aşırı keskinleştirme sonucu halo etkisi (parlak kenarlar) oluşabilir
Görüntüdeki bir piksel satırını bir yol profili gibi düşünelim:
Görüntü (Yoğunluk): Yolun yüksekliği. Düz alanlar düz yolu, kenarlar yokuşları temsil eder.
Birinci Türev (Eğim): Yolun eğimi. Kenarın varlığını ve yönünü söyler. Yokuşun başladığı yerdir.
İkinci Türev (Laplacian): Eğimdeki değişim hızı. Yokuşun en dik olduğu noktayı bulur. Bu yüzden kenarlara karşı çok hassastır.
Laplacian, bir görüntünün ikinci türevlerinin toplamı ile hesaplanır:
\[ \nabla^2 f(x, y) = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} \]
4 Komşulu
\[ \begin{bmatrix} 0 & 1 & 0 \\\\ 1 & -4 & 1 \\\\ 0 & 1 & 0 \end{bmatrix} \]
8 Komşulu
\[ \begin{bmatrix} 1 & 1 & 1 \\\\ 1 & -8 & 1 \\\\ 1 & 1 & 1 \end{bmatrix} \]
Yani:
\[ A = \begin{bmatrix} 120 & 130 & 150 & 140 & 130 \\ 120 & 130 & 150 & 140 & 130 \\ 120 & 130 & 150 & 140 & 130 \\ 120 & 120 & 120 & 120 & 120 \\ 120 & 120 & 120 & 120 & 120 \end{bmatrix} \]
Laplacian Çekirdeği
\[ \text{Kernel} = \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} \]
(0,2) Pikseli (Değer = 150)
Komşular:
\[ g(0,2) = (0) + (150) + (130) + (140) - (4 * 150) \]
\[ = 420 - 600 = -180 \]
(1,2) Pikseli (Değer = 150)
Komşular:
\[ g(1,2) = (150) + (150) + (130) + (140) - (4 * 150) \]
\[ = 570 - 600 = -30 \]
Komşular:
\[ g(2,2) = (150) + (120) + (130) + (140) - (4 * 150) \]
\[ = 540 - 600 = -60 \]
\[ \text{Laplacian}(A) = \begin{bmatrix} 0 & 0 & -180 & 0 & 0 \\ 0 & 0 & -30 & 0 & 0 \\ 0 & 0 & -60 & 0 & 0 \\ 0 & 0 & 30 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \]
Unsharp Masking, adının aksine bir görüntüdeki kenarları daha keskin hale getirmek için kullanılan bir görüntü iyileştirme (sharpening) tekniğidir.
Unsharp Masking formülü:
\[ g(x, y) = f(x, y) + \lambda \cdot (f(x, y) - f_b(x, y)) \]
Burada:
Blur uygula:
\(f_b(x,y) = \text{GaussianBlur}(f(x,y))\)
Maskeyi çıkar:
\(\text{Mask} = f(x,y) - f_b(x,y)\)
Görüntüyü keskinleştir:
\(g(x,y) = f(x,y) + \lambda \cdot \text{Mask}\)
[ Orijinal Görüntü ]
|
+----> [ Gaussian Blur Uygula ] ------> [ Bulanık Görüntü ]
|
| (Orijinal - Bulanık)
+-------------------------------------> [ Kenar Maskesi (Detaylar) ]
|
| (Orijinal + Maske)
+-------------------------------------> [ Keskinleştirilmiş Görüntü ]
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Görüntüyü gri tonlamalı oku
img = cv2.imread('../assets/images/cameraman.png', cv2.IMREAD_GRAYSCALE)
# Ortalama (Mean) Blur
mean_blur = cv2.blur(img, (3, 3))
# Gaussian Blur
gaussian_blur = cv2.GaussianBlur(img, (3, 3), 0)
# Median Blur
median_blur = cv2.medianBlur(img, 3)import cv2
import numpy as np
import matplotlib.pyplot as plt
# Görüntüyü gri tonlamalı olarak yükle
img = cv2.imread('../assets/images/rice.png', cv2.IMREAD_GRAYSCALE)
# Gaussian Blur uygula
blurred = cv2.GaussianBlur(img, (5, 5), 0)
# Unsharp Masking: g(x,y) = 2f(x,y) - f_b(x,y)
unsharp = cv2.addWeighted(src1=img, alpha=2.0, src2=blurred, beta=-1.0, gamma=0)High-Boost Filtering, keskinleştirme işlemini daha da ileri götüren bir tekniktir.
Sadece kenarları değil, aynı zamanda orijinal görüntünün genel parlaklığını ve detaylarını da vurgular.
Unsharp Masking’de:
\[ g(x, y) = f(x, y) + \lambda \cdot (f(x, y) - f_b(x, y)) \]
Yani:
High-Boost filtresi şu şekilde ifade edilir:
\[ g(x, y) = A \cdot f(x, y) - f_b(x, y) \]
Burada:
Eğer ( A = 1 ) → Bu, klasik Unsharp Masking’dir: \[ g(x,y) = f(x,y) + (f(x,y) - f_b(x,y)) = 2f(x,y) - f_b(x,y) \]
Eğer ( A > 1 ) → Yalnızca kenarlar değil, orijinal görüntü de güçlendirilir.
| A (Kazanç Katsayısı) | Etki |
|---|---|
| A = 1 | Unsharp Masking ile aynı |
| A = 1.5 | Hafif güçlendirme |
| A = 2 veya 3 | Daha güçlü detay vurgulama |
| A >> 1 | Aşırı kontrast → halo/parazit riski artar |
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('../assets/images/rice.png', cv2.IMREAD_GRAYSCALE)
blurred = cv2.GaussianBlur(img, (5, 5), 0)
# High-Boost: A katsayısı belirlenir (örneğin 1.0 → unsharp, 1.5 ve 2.0 → high-boost)
A_values = [1.0, 2, 2.5]
# Görüntüleri saklamak için liste
outputs = []
for A in A_values:
high_boost = cv2.addWeighted(src1=img, alpha=A, src2=blurred, beta=-1.0, gamma=0)
outputs.append((A, high_boost))| Teknik | Formül | Ne Yapar? |
|---|---|---|
| Unsharp Masking | \(f + (f - f_b)\) | Kenarları öne çıkarır |
| High-Boost Filtering | \(A \cdot f - f_b\) | Kenar + orijinal detayı vurgular |
| Kavram | Yumuşatma (Blurring) | Keskinleştirme (Sharpening) |
|---|---|---|
| Amaç | Gürültü azaltma, detayları sadeleştirme | Detayları ve kenarları vurgulama |
| Frekans Domeni | Alçak Geçiren Filtre (Low-Pass) | Yüksek Geçiren Filtre (High-Pass) |
| Temel Mantık | Pikselleri komşularına benzetme | Pikselleri komşularından farklılaştırma |
| Örnek Yöntemler | Gaussian Blur, Median Filter, Bilateral | Laplacian Filter, Unsharp Masking |
Bilgisayarla Görü – OMÜ | 🏠