Bilgisayarlı Görü

Bulanıklaştırma ve Keskinleştirme

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

2026

Giriş

Pikselden Komşuluğa

Önceki derste görüntünün sayı dizisi olarak temsilini ve tek piksele uygulanan işlemleri ele aldık.

Bir pikselin yeni değeri, çevresindeki piksellerden nasıl hesaplanır?

Komşuluk işlemleri; gürültü azaltma, detay çıkarma ve keskinleştirmenin ortak temelidir.

Öğrenme Kazanımları

Bu dersin sonunda:

  • Bir çekirdeğin piksel komşuluğuna nasıl uygulandığını hesaplayabileceksiniz.
  • Korelasyon ile konvolüsyonu ayırt edebileceksiniz.
  • Gürültü ve korunacak ayrıntıya göre filtre seçebileceksiniz.
  • Filtre boyutu ve ağırlık parametrelerinin etkisini yorumlayabileceksiniz.
  • Detay maskesi ile keskinleştirilmiş görüntüyü ayırt edebileceksiniz.
  • Filtre sonuçlarını temiz referansla karşılaştırabileceksiniz.

Komşuluk İşlemleri

Çekirdek ve Merkez

Çekirdek (kernel), komşuluk değerlerinin nasıl birleştirileceğini belirleyen küçük bir matristir.

  • 3×3 çekirdeğin merkezi, çıktı değeri hesaplanacak piksele yerleştirilir.
  • Çekirdek görüntü üzerinde kaydırılır; her konumda kaynak görüntüden yeni bir çıktı hesaplanır.
  • Çıktılar ayrı bir dizide tutulur. Önceden hesaplanan çıktılar sonraki komşuluklara karıştırılmaz.

Örnek (ortalama çekirdeği): dokuz komşu, dokuz ağırlıkla çarpılıp toplanır ve tek bir çıktı değeri üretir.

\[ k=\frac{1}{9}\begin{bmatrix}1&1&1\\1&1&1\\1&1&1\end{bmatrix} \]

Korelasyon

\(x\) sütun, \(y\) satır; \(u\) yatay ve \(v\) düşey ofset olsun. Dizi erişim sırası \(I[y,x]\) biçimindedir.

\[ g[y,x]=\sum_{v=-r}^{r}\sum_{u=-r}^{r} k[v,u]f[y+v,x+u] \]

Burada \(k[v,u]\), merkez etrafındaki ofsetlerle yazılmış çekirdek ağırlığıdır.

Her komşu kendi ağırlığıyla çarpılır; çarpımlar toplanır. OpenCV filter2D bu işlemi uygular.

Konvolüsyon ile Farkı

Konvolüsyonda çekirdek iki eksende ters çevrilir:

\[ g[y,x]=\sum_{v=-r}^{r}\sum_{u=-r}^{r} k[v,u]f[y-v,x-u] \]

  • Korelasyon: çekirdek doğrudan kullanılır.
  • Konvolüsyon: çekirdek 180° döndürülür.
  • Bu dersteki merkez simetrili ortalama, Gauss ve Laplasyen çekirdeklerinde iki işlem aynı sonucu verir.

Aynı Pencere, İki Sonuç

Komşuluk \(f\)

\[\begin{bmatrix}1&2&3\\4&5&6\\7&8&9\end{bmatrix}\]

Çekirdek \(k\)

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

180° döndürülmüş \(k'\)

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

İşlem Hesap Sonuç
Korelasyon (\(k\)) \(1\cdot1+2\cdot2+1\cdot5\) 10
Konvolüsyon (\(k'\)) \(1\cdot5+2\cdot8+1\cdot9\) 30

Çekirdeğin sayıları aynı; yalnızca hangi komşuyla eşleştikleri değişti.

Korelasyon ve Konvolüsyon: Adım Adım

Ne izlenmeli? Düğmelerle adım adım ilerleyin: sarı hücreler aynı çarpıma giren komşu ve ağırlıktır. Konvolüsyonu seçince çekirdek yarım tur döner ve sonuç değişir.

Sınırdaki Pikselin Komşuları

Görüntü dışında kalan konumlar için bir sınır kuralı gerekir:

Kural Görüntü dışındaki değerler
Sıfır dolgulama 0 kabul edilir
Kenarı tekrarlama En yakın sınır pikseli kullanılır
Yansıtma Görüntü sınırdan yansıtılarak uzatılır

Sıfır dolgulama, sabit ve aydınlık bir görüntünün kenarında yapay bir karanlık geçiş oluşturabilir.

Bu dersteki tam matris hesabında sıfır dolgulama kullanılır. OpenCV kodlarında sınır kuralı açıkça belirtilir.

Sınır İşlemleri: Aynı Piksel, Üç Sonuç

Ne izlenmeli? Üç sınır kuralını sırayla seçin: mavi hücreler görüntünün dışından üretilir ve aynı pikselin çıktısı değişir.

Çekirdek Toplamı Ne Söyler?

Komşuluğun tamamı \(c\) değerindeyse doğrusal filtrenin çıktısı:

\[ g=c\sum_{v,u}k[v,u] \]

Çekirdek toplamı Sabit bölgeye etkisi Örnek
1 Yoğunluğu korur Normalize ortalama, Gauss, keskinleştirme
0 Çıktı sıfır olur Laplasyen, detay çıkarma

Bu özellik, sınır kuralının sabit bölgeyi bozmadığı komşuluklarda geçerlidir.

Görüntü Yumuşatma

Yumuşatma Neyi Değiştirir?

01 Kaynak görüntü
Keskin kenarlar ve ince dokular içeren kaynak kameraman görüntüsü

Kenar geçişleri ve ince doku belirgin.

02 Gauss ile yumuşatma
Gauss filtresi uygulanmış, kenarları ve ince dokusu yumuşamış kameraman görüntüsü

Hızlı yoğunluk değişimleri bastırılmış.

Yumuşatma gürültüyü azaltabilir; kenarlar ve ince ayrıntılar da zayıflayabilir.

Alçak ve Yüksek Frekans

Bir görüntü satırında değişimin hızı frekansı belirler:

Görüntüde Değişim Frekans
Geniş gökyüzü, düz duvar Yavaş Alçak
Kenar, ince doku, saç teli, gürültü Hızlı Yüksek
  • Yumuşatma hızlı değişimleri bastırır, yavaş olanları korur: bu yüzden alçak geçiren filtre denir.
  • Her piksel, komşularının ağırlıklı ortalamasına yaklaşır.
  • Sorun: gürültü de ince bir kenar da hızlı değişimdir; basit bir filtre ikisini ayıramaz.

Amaç ve Ödünleşim

  • Gürültüyü azaltmak.
  • Küçültme öncesinde aliasing riskini azaltmak.
  • Kenar tespiti öncesinde gürültünün oluşturduğu sahte tepkileri bastırmak.
  • Görev için önemsiz küçük ayrıntıları sadeleştirmek.

Temel soru: Gürültü azalırken hangi gerçek yapılar kayboluyor?

Neden Önce Yumuşatma?

Aynı kenar bulucu: gürültülü görüntüde sahte kenarlar, yumuşatılmış görüntüde nesne sınırları.

Doğrusal ve Doğrusal Olmayan Filtreler

Yöntem Yeni pikselin hesabı Tür
Ortalama Sabit, eşit ağırlıklarla toplam Doğrusal
Gauss Sabit, uzaklığa bağlı ağırlıklarla toplam Doğrusal
Medyan Sıralanmış komşuluğun ortanca değeri Doğrusal olmayan
Bilateral Konum ve görüntü değerine bağlı ağırlıklarla ortalama Doğrusal olmayan

Medyan ve bilateral için, doğrusal filtrelerdeki gibi görüntüden bağımsız tek bir frekans cevabı tanımlanmaz.

Ortalama Filtresi

\[ k=\frac{1}{9}\begin{bmatrix}1&1&1\\1&1&1\\1&1&1\end{bmatrix} \]

  • Basit ve hızlıdır.
  • Merkez dâhil dokuz piksele eşit ağırlık verir.
  • Çekirdek toplamı 1’dir.
  • Gürültüyü azaltabilir; kenarların iki tarafındaki değerleri de karıştırır.
  • Pencere büyüdükçe daha geniş yapılar birbirine karışır.

Ortalama Filtresi: Komşuluktan Çıktıya

Ne izlenmeli? Dokuz değer toplanır (500), 9’a bölünür (≈55,56). Kaynak matris değişmez; sonuç ayrı bir matrise yazılır.

Gauss Filtresi

Ortalama filtre yakın ve uzak komşuya aynı ağırlığı verir. Yakın piksellerin birbirine daha çok benzemesini bekleriz; bu yüzden ağırlıkları bir çan eğrisiyle (Gauss dağılımı) azaltırız.

\[ k[v,u]\propto \exp\left(-\frac{u^2+v^2}{2\sigma^2}\right),\qquad \sum k[v,u]=1 \]

  • Merkeze yakın komşuların ağırlığı daha yüksektir.
  • \(\sigma\), ağırlıkların uzamsal yayılımını belirler.
  • Pencere boyutu, hesaba katılan komşuluğu sınırlar.
  • Gauss filtresi de kenarları bulanıklaştırır; kenar koruyucu değildir.

Gauss Benzeri 3×3 Binom Çekirdeği

\[ k=\frac{1}{16}\begin{bmatrix}1&2&1\\2&4&2\\1&2&1\end{bmatrix} \]

Bu çekirdek, Gauss yumuşatmasının yaygın bir ayrık yaklaşımıdır.

\[ k=\frac{1}{4}\begin{bmatrix}1\\2\\1\end{bmatrix} \frac{1}{4}\begin{bmatrix}1&2&1\end{bmatrix} \]

İki boyutlu işlem, yatay ve düşey iki tek boyutlu filtreyle uygulanabilir.

Ayrılabilir Gauss Çekirdeği: Yatay ve Düşey

Ne izlenmeli? Yatay ara sonuç, ardından düşey adım, sonra doğrudan 3×3 sonuç: aradaki en büyük fark 0’dır.

Gauss Filtresi: Ağırlıklı Toplam

Ne izlenmeli? Her değer konum ağırlığıyla çarpılır: merkez 4·100, toplam 1000, 1000/16 = 62,5.

Medyan Filtresi

Komşuluk değerleri sıralanır; ortadaki değer çıktı olur.

\[ \begin{bmatrix}10&20&30\\20&255&40\\30&40&50\end{bmatrix} \longrightarrow [10,20,20,30,\boxed{30},40,40,50,255] \]

Merkezdeki 255 yerine 30 yazılır.

  • Ortalama ve Gauss aşırı değerli bir pikseli komşulara yayar: bu örnekte ortalama \((10+20+30+20+255+40+30+40+50)/9=55\), medyan 30.
  • Dürtüsel tuz ve karabiber gürültüsünde etkilidir.
  • Bu örnekte 255’in gürültü olduğu varsayılmıştır.
  • Küçük parlak nesneler ve ince çizgiler de silinebilir.

Medyan Filtresi: Sıralama ve Seçim

Ne izlenmeli? Komşular sırayla sıralı listeye yerleşir ve beşinci değer seçilir; toplama ve bölme yoktur.

Bilateral: Kenarı Koruyarak Yumuşatma

Pikselin yeni değeri komşularının “oyuyla” belirlenir; ama her oyun değeri aynı değildir:

  1. Yakın komşunun oyu daha değerli (konum ağırlığı)
  2. Bana benzeyen komşunun oyu daha da değerli (yoğunluk ağırlığı)

Kenarın öbür yanındaki komşunun değeri çok farklı olduğu için oyu neredeyse 0 sayılır: kenar korunur.

Bilateral Filtre

Hem yakın hem benzer yoğunluktaki komşulara daha yüksek ağırlık verir:

\[ I'(p)=\frac{\sum_{q\in\Omega_p} I(q)w(p,q)}{\sum_{q\in\Omega_p}w(p,q)} \]

\[ w(p,q)=\exp\left(-\frac{\|p-q\|^2}{2\sigma_s^2}\right) \exp\left(-\frac{(I(p)-I(q))^2}{2\sigma_r^2}\right) \]

Formül gri seviye görüntü içindir. Ağırlıklar görüntünün değerlerine bağlıdır.

Yoğunluk Ağırlığı: Sayılarla

\[ w_r=\exp\left(-\frac{(I(p)-I(q))^2}{2\sigma_r^2}\right) \]

Merkez \(I(p)=50\) olsun. Komşunun değeri merkezden ne kadar farklıysa ağırlığı o kadar düşer:

Komşu \(I(q)\) Fark \(\sigma_r=30\) \(\sigma_r=100\)
50 0 1 1
80 30 0,61 0,96
110 60 0,14 0,84
200 150 0,0000037 (\(\approx 0\)) 0,32

\(\sigma_r\) küçükse kenarın öbür yanı hesaba girmez; büyükse karışır. Bu ağırlık, konum ağırlığıyla çarpılır. Tabloda 0’a yuvarlanan değer tam sıfır değildir.

Bilateral Parametreleri

Parametre Etkisi
Komşuluk çapı Değerlendirilecek alanı sınırlar
\(\sigma_s\) Uzaktaki komşuların katkısını belirler
\(\sigma_r\) Yoğunluk farklarına gösterilen toleransı belirler
  • Küçük \(\sigma_r\): farklı yoğunluktaki komşuların katkısı azalır.
  • Büyük \(\sigma_r\): kenarın iki tarafı da karışabilir.
  • Kenar ötesindeki katkı genellikle küçüktür; mutlaka sıfır değildir.
  • Aşırı yumuşatma ince dokuyu silebilir.

Bilateral Filtre: İki Ağırlığın Birleşimi

Ne izlenmeli? Konum ve yoğunluk ağırlıkları çarpılır: kenarın öbür yanındaki komşunun ağırlığı sıfıra yakındır, kenar korunur.

Filtre Seçimi Probleme Bağlıdır

Durum Başlangıç adayı Kontrol edilecek kayıp
Dürtüsel gürültü Medyan Küçük nesne ve ince çizgi kaybı
Eklemeli rastgele gürültü Gauss veya ortalama Kenar ve doku bulanıklığı
Kenarlar korunarak yumuşatma Bilateral Doku kaybı ve işlem süresi
Küçültme öncesi ön filtreleme Uygun alçak geçiren filtre Gereğinden fazla ayrıntı kaybı

Her görüntü ve görev için tek bir en iyi filtre yoktur.

Aynı Komşulukta Üç Sonuç

\[ \begin{bmatrix}50&50&50\\50&100&50\\50&50&50\end{bmatrix} \]

Yöntem Merkez piksel hesabı Sonuç
Ortalama \((8\cdot50+100)/9\) \(55.56\ldots\)
Binom çekirdeği \((12\cdot50+4\cdot100)/16\) \(62.5\)
Medyan Dokuz değerin ortancası \(50\)

Sonuçlar gerçek sayı olarak gösterilmiştir. Tam sayı görüntüye dönüşümde yuvarlama ve sınırlandırma gerekir.

Gürültü mü, Küçük Bir Nesne mi?

Merkezdeki 100 gerçek bir küçük nesneyse, medyan onu siler. Bozulmuş bir piksel ise bu değişim yararlı olabilir.

Bir filtre, hangi ayrıntının anlamlı olduğunu kendiliğinden bilmez.

Görüntüleme, belge temizleme ve görsel algılama uygulamalarında yöntem seçimi, korunması gereken yapıya göre değerlendirilir.

Nerede Kullanılır? Yumuşatma

Filtre Tipik kullanım
Ortalama Basit yumuşatma, hızlı ön işleme
Gauss Kenar bulmadan ve küçültmeden önce ön işleme; otonom araç kamerasında şerit ve yaya algılamadan önce gürültü azaltma
Medyan Tuz ve karabiber gürültüsü: taranmış belge, bozuk sensör pikseli, tıbbi görüntü
Bilateral Kenarı koruyan yumuşatma: portre rötuşunda cildi yumuşatıp göz ve dudak kenarlarını korumak

Yumuşatma bir ön işleme adımıdır; sonraki görevi bozmadığı ayrıca doğrulanmalıdır.

Uygulama ve Değerlendirme

Tekrarlanabilir Deney

  1. Temiz bir referans görüntü seçilir.
  2. Sabit rastgelelik tohumu ile kontrollü gürültü eklenir.
  3. Aynı gürültülü görüntü farklı filtrelerle işlenir.
  4. Sonuçlar temiz referansla, aynı yoğunluk aralığında karşılaştırılır.

Örnekler Python, NumPy, Matplotlib, OpenCV ve scikit-image kullanır. data.camera() paketle gelen test görüntüsüdür; dosya yolu gerektirmez. Kod blokları sırayla çalıştırılır.

Referans ve Gürültülü Görüntü

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import data

clean = data.camera().astype(np.float32)  # [0, 255]
rng = np.random.default_rng(42)
noisy = np.clip(clean + rng.normal(0, 15, clean.shape),
                0, 255).astype(np.float32)
border = cv2.BORDER_REFLECT_101

Gürültü modeli eklemeli Gauss gürültüsüdür. Bu deney, dürtüsel gürültü hakkında doğrudan sonuç vermez.

Aynı Girdi, Dört Filtre

results = {
    'Gürültülü': noisy,
    'Ortalama': cv2.blur(noisy, (5, 5), borderType=border),
    'Gauss': cv2.GaussianBlur(noisy, (5, 5), 1.0,
                             borderType=border),
    'Medyan': cv2.medianBlur(noisy, 5),
    'Bilateral': cv2.bilateralFilter(noisy, 9, 25, 3,
                                    borderType=border),
}

Medyan için OpenCV kenar tekrarlama kullanır; burada diğer filtreler için yansıtma seçilmiştir. Filtrelerin komşuluk ve parametreleri de farklıdır; sonuçlar bu ayarlara aittir.

PSNR: Referansa Ne Kadar Yakın?

\[ \operatorname{MSE}=\frac{1}{HW}\sum_{y,x}(f[y,x]-g[y,x])^2 \]

\[ \operatorname{PSNR}=10\log_{10}\left(\frac{255^2}{\operatorname{MSE}}\right) \]

  • Bu örnekte yoğunluk aralığı 0–255’tir.
  • Aynı referans ve aralıkta yüksek PSNR, daha düşük karesel hata demektir.
  • Görsel kaliteyi veya sonraki bir görevin başarısını tek başına ölçmez.
  • Temiz görüntüyü bulanıklaştırıp kendisiyle karşılaştırmak, gürültü giderme başarısını ölçmez.

Güvenli PSNR Hesabı

def compute_psnr(reference, processed):
    if reference.shape != processed.shape:
        raise ValueError('Görüntü boyutları aynı olmalı.')
    difference = (reference.astype(np.float64)
                  - processed.astype(np.float64))
    mse = np.mean(difference ** 2)
    return np.inf if mse == 0 else 10 * np.log10(255.0 ** 2 / mse)

assert np.isinf(compute_psnr(clean, clean))
assert np.isclose(compute_psnr(np.array([[0]], dtype=np.uint8),
                               np.array([[255]], dtype=np.uint8)), 0)
for name, image in results.items():
    print(f'{name}: {compute_psnr(clean, image):.2f} dB')

Dönüşüm, çıkarma ve kare alma işlemlerinden önce yapılır; uint8 taşması önlenir.

Sonuçları Aynı Ölçekte Görmek

fig, axes = plt.subplots(2, 3, figsize=(12, 8))
for ax, (name, image) in zip(
        axes.ravel(), [('Referans', clean), *results.items()]):
    ax.imshow(image, cmap='gray', vmin=0, vmax=255)
    ax.set_title(name)
    ax.axis('off')
plt.tight_layout()
plt.show()

Kenar, düz bölge ve ince dokular ayrı ayrı incelenir. Sayısal puan ile görsel gözlem birlikte değerlendirilir.

Gürültü Giderme: Görüntü ve PSNR

Ne izlenmeli? Gürültü türünü değiştirin: aynı gürültülü girdiye üç filtre uygulanır, PSNR çubukları temiz referansa yakınlığı karşılaştırır.

Tuz ve Karabiber Gürültüsü

rng = np.random.default_rng(42)
impulse = clean.copy()
r = rng.random(clean.shape)
impulse[r < 0.025] = 0
impulse[r > 0.975] = 255

impulse_results = {
    'Gürültülü': impulse,
    'Gauss': cv2.GaussianBlur(impulse, (5, 5), 1.0,
                             borderType=border),
    'Medyan': cv2.medianBlur(impulse, 5),
}
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, (name, image) in zip(axes, impulse_results.items()):
    print(f'{name}: {compute_psnr(clean, image):.2f} dB')
    ax.imshow(image, cmap='gray', vmin=0, vmax=255)
    ax.set_title(name)
    ax.axis('off')
plt.tight_layout()
plt.show()

Ne bakılır? Gauss aşırı değerli pikseli komşulara yayar; medyan çoğu zaman tek tek bozulmuş pikselleri siler. Önceki Gauss gürültüsü deneyindeki sıralama bu gürültüde de geçerli mi? PSNR ve görüntüyü birlikte yorumlayın.

Pencere ve Sigma Etkisi

variants = {
    '3×3, sigma=0.8': cv2.GaussianBlur(noisy, (3, 3), 0.8),
    '9×9, sigma=0.8': cv2.GaussianBlur(noisy, (9, 9), 0.8),
    '9×9, sigma=2.0': cv2.GaussianBlur(noisy, (9, 9), 2.0),
}
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, (name, image) in zip(axes, variants.items()):
    ax.imshow(image, cmap='gray', vmin=0, vmax=255)
    ax.set_title(name)
    ax.axis('off')
plt.tight_layout()
plt.show()

Ne bakılır?

  • 1 → 2: pencere 3×3’ten 9×9’a, \(\sigma\) sabit. \(\sigma\) küçükken uzak komşuların ağırlığı çok küçük olduğundan fark azdır.
  • 2 → 3: \(\sigma\) 0,8’den 2’ye, pencere sabit. Bulanıklık belirgin artar.

Bilateral: Benzerlik ve Uzaklık

settings = [(9, 10, 3), (9, 60, 3), (9, 60, 1)]
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, (diameter, sigma_r, sigma_s) in zip(axes, settings):
    image = cv2.bilateralFilter(noisy, diameter, sigma_r, sigma_s,
                                borderType=border)
    ax.imshow(image, cmap='gray', vmin=0, vmax=255)
    ax.set_title(f'sigma_r={sigma_r}, sigma_s={sigma_s}')
    ax.axis('off')
plt.tight_layout()
plt.show()

Ne bakılır? Komşuluk çapı sabittir.

  • 1 → 2: \(\sigma_r\) 10’dan 60’a. Gürültü genliğinden (≈15) küçük \(\sigma_r\)’de komşular genellikle “farklı” sayılır ve yumuşatma azalır.
  • 2 → 3: \(\sigma_s\) 3’ten 1’e. Uzak komşuların katkısı azalır; yumuşatma yerelleşir.

Görüntü Keskinleştirme

Detay Maskesi ile Son Görüntü Farklıdır

  • Yüksek geçiren işlem, hızlı değişimleri içeren bir detay maskesi üretebilir.
  • Keskinleştirmede bu detaylar kaynak görüntüye eklenir.
  • Gürültü de güçlenebilir; aşırı uygulama halo oluşturabilir.
  • Keskinleştirme yumuşatmanın matematiksel tersi değildir; kaybolan bilgiyi geri getirme garantisi yoktur.

Bir Keskinleştirme Çekirdeği

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

Çekirdeğin toplamı 1’dir: sabit bir iç bölgede yoğunluk korunur.

Komşulara göre farklı olan merkez değerler vurgulanır. Bu işlem, yalnızca yüksek geçiren detay çıktısı üretmekten farklıdır.

Türevlerin Sezgisel Anlamı

Bir görüntü satırındaki yumuşak basamak kenarı için:

  • Yoğunluk: Karanlıktan aydınlığa geçer.
  • Birinci türev: Geçişin en dik olduğu yerde büyür.
  • İkinci türev: Eğimin değişimini ölçer; kenar çevresinde pozitif ve negatif loblar, aralarında sıfır geçişi oluşabilir.

Yoğunluk artışını doğrudan “pozitif ikinci türev”, azalışını “negatif ikinci türev” olarak yorumlamak doğru değildir.

Türevler: Kenar Profilini İzleme

Ne izlenmeli? Sarı çizgi üç grafikte aynı konumu izler: kenarın ortasında birinci türev tepe yapar, ikinci türev sıfırdan geçer.

Laplasyen

\[ \nabla^2f=\frac{\partial^2f}{\partial x^2}+\frac{\partial^2f}{\partial y^2} \]

Ayrık yaklaşımlar:

4 komşulu

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

8 komşulu (köşegenler de katılır)

\[L_8=\begin{bmatrix}1&1&1\\1&-8&1\\1&1&1\end{bmatrix}\]

Bu derste 4 komşulu \(L\) kullanılır: iki eksendeki ikinci türev tepkilerini toplar. Sabit bölgede sonuç sıfırdır; gürültüye duyarlıdır.

Laplasyen Hesabı: Koordinat ve Sınır

\[ 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} \]

İndeksler [satır, sütun] ve sıfır tabanlıdır. Görüntü dışındaki değerler 0 kabul edilir.

Kenar: 3. sütundaki parlak 150 değerleri. Çekirdek: önceki slayttaki 4 komşulu \(L\).

Üç Pikselin Hesabı

\(L = \text{üst}+\text{alt}+\text{sol}+\text{sağ}-4\cdot\text{merkez}\)

Piksel Üst Alt Sol Sağ Merkez Hesap \(L\)
[0,2] 0 (dışarısı) 150 130 140 150 \(420-600\) −180
[1,2] 150 150 130 140 150 \(570-600\) −30
[2,2] 150 120 130 140 150 \(540-600\) −60

İlk satırdaki büyük negatif tepkinin bir bölümü, üst komşunun sıfır kabul edilmesinden kaynaklanır.

Tam Laplasyen Sonucu

\[ L(A)=\begin{bmatrix} -230&-120&-180&-140&-250\\ -110&10&-30&0&-120\\ -110&0&-60&-20&-130\\ -120&10&30&20&-110\\ -240&-120&-120&-120&-240 \end{bmatrix} \]

Yalnızca parlak sütun tepki vermez. Sıfır dolgulama, görüntünün dış çerçevesinde de büyük tepkiler üretir.

Nasıl okunur? Negatif: piksel dört komşusunun ortalamasından parlak. Pozitif: daha koyu. Sıfır: komşularıyla uyumlu.

Laplasyenden Keskinleştirmeye

Negatif merkezli \(L\) çekirdeği için:

\[ g=f-\alpha L(f),\qquad \alpha>0 \]

\(\alpha=1\) için eşdeğer çekirdek:

\[ \delta-L=\begin{bmatrix}0&-1&0\\-1&5&-1\\0&-1&0\end{bmatrix} \]

Çekirdeğin işareti ters çevrilirse ekleme/çıkarma işareti de ters çevrilmelidir.

Laplasyen: İşaretli Tepkiden Keskinleştirmeye

Ne izlenmeli? Önce işaretli Laplasyen tepkisi, sonra kaynaktan çıkarılması: g = f − α·L(f). Sınırdaki büyük değerler sıfır dolgulamadan gelir.

İşaretli Tepkiyi Korumak

lap = cv2.Laplacian(clean, cv2.CV_32F, ksize=1,
                    borderType=cv2.BORDER_REFLECT_101)
sharp_lap = clean - 0.5 * lap
sharp_display = np.clip(sharp_lap, 0, 255).astype(np.uint8)
  • Negatif Laplasyen değerleri hesap boyunca korunur.
  • Bu kod yansıtmalı sınır kullanır; önceki sıfır dolgulu matrisle sınır değerleri aynı değildir.
  • Mutlak değerle görselleştirme, işaretli tepkinin yerine hesaplamaya sokulmamalıdır.

Unsharp Maskeleme

\[ m=f-f_b,\qquad g=f+\lambda m \]

  1. Kaynağı bulanıklaştır → \(f_b\)
  2. Maskeyi çıkar: \(m=f-f_b\) (kenar ve ince ayrıntılar)
  3. Maskeyi \(\lambda\) ile çarpıp kaynağa ekle → \(g\)
  • \(f_b\): Kaynak görüntünün yumuşatılmış hâli.
  • \(m\): Kenar, ince doku ve gürültü içerebilen detay maskesi.
  • \(\lambda\): Maskenin katkısı; \(\lambda=0\) kaynak görüntüyü verir.
  • Bulanıklaştırma ölçeği ile \(\lambda\) birlikte sonucu belirler. Tek bir “doğal keskinlik” değeri yoktur.

“Unsharp” adı, maskenin keskin olmayan (bulanık) bir kopyadan üretilmesinden gelir; sonuç ise daha keskindir.

Unsharp: Maskenin Oluşumu

Ne izlenmeli? Sırayla: kaynak, bulanık kopya, detay maskesi, sonuç. Maske kaynaktan bulanığın çıkarılmasıyla oluşur.

Unsharp Uygulaması

blurred = cv2.GaussianBlur(clean, (5, 5), 1.0,
                           borderType=border)
mask = clean - blurred
amount = 1.0
unsharp = clean + amount * mask

fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, title, image in zip(axes,
        ['Kaynak', 'İşaretli detay maskesi', 'Keskinleştirilmiş'],
        [clean, mask, unsharp]):
    if title == 'İşaretli detay maskesi':
        ax.imshow(image, cmap='gray', vmin=-50, vmax=50)
    else:
        ax.imshow(np.clip(image, 0, 255), cmap='gray', vmin=0, vmax=255)
    ax.set_title(title)
    ax.axis('off')
plt.tight_layout()
plt.show()

High-Boost: Formül ve Parametre

Bu derste kullanılan tanım:

\[ g=Af-f_b=(A-1)f+(f-f_b) \]

\(A\) Sonuç
1 Yalnızca detay maskesi \(f-f_b\)
2 \(\lambda=1\) Unsharp sonucu \(2f-f_b\)
\(>2\) Kaynak katkısı ve sabit bölge yoğunluğu da artar

High-Boost teriminin farklı kullanımları vardır. Karşılaştırmada ad yerine formül ve katsayılar esas alınır.

Sabit Bölgede Ne Olur?

\(f=f_b=c\) olan bir bölgede:

\[ \begin{aligned} \text{Unsharp: }&c+\lambda(c-c)=c\\ \text{Bu High-Boost tanımı: }&Ac-c=(A-1)c \end{aligned} \]

Unsharp sabit bölgeyi korur. \(Af-f_b\) ise \(A=2\) dışında sabit bölgenin yoğunluğunu değiştirir. Parlaklık değişimi, keskinlik artışıyla aynı şey değildir.

High-Boost: Kazanç ve Sabit Bölge

Ne izlenmeli? A kazancını değiştirin ve sabit bölgenin parlaklığına bakın: A = 2 dışında yoğunluk değişir.

High-Boost Karşılaştırması

fig, axes = plt.subplots(1, 3, figsize=(12, 4))
for ax, gain in zip(axes, [1.0, 2.0, 2.5]):
    output = gain * clean - blurred
    if gain == 1.0:
        ax.imshow(output, cmap='gray', vmin=-50, vmax=50)
        ax.set_title('A=1: detay maskesi (±50 ölçeği)')
    else:
        ax.imshow(np.clip(output, 0, 255), cmap='gray', vmin=0, vmax=255)
        ax.set_title(f'A={gain}: çıktı (0–255 ölçeği)')
    ax.axis('off')
plt.tight_layout()
plt.show()

Her çıktıyı ayrı ayrı min–maks normalize etmek, parlaklık ve kazanç farklarını gizleyebilir. Görüntüleme ölçekleri açıkça belirtilmiştir.

Keskinleştirmenin Sınırları

  • Gürültü ve sıkıştırma izleri de güçlenebilir.
  • Aşırı katkı, kenar çevresinde parlak/koyu halolar oluşturabilir.
  • Clipping, 0 altı ve 255 üstü değerleri keserek ayrıntı kaybına yol açar.
  • Gürültü varsa genellikle önce gürültü azaltma, sonra keskinleştirme denenir; ama aşırı yumuşatma hedef ayrıntıyı da silebilir.
  • Görüntünün daha keskin görünmesi, ölçüm veya tanıma başarısının arttığını garanti etmez.

Aşırı Keskinleştirme: Halo ve Clipping

Ne izlenmeli? λ’yı artırın: kenar çevresinde halo, 0–255 dışına taşan değerlerde clipping oluşur; gürültü de güçlenir.

Nerede Kullanılır? Keskinleştirme

Alan Amaç
Tıbbi görüntüleme Sınır ve lezyon belirginleştirme (yardımcı; tanı yerine geçmez)
Uydu görüntüleri Yüzey ayrıntılarını öne çıkarma
OCR ve belge Yazı kenarlarını netleştirme
Astronomi Ham görüntülerde yıldız ve gaz bulutu kenarlarını öne çıkarma
Genel iyileştirme Algılanan keskinliği artırma

Daha keskin görünmek, ölçüm ya da tanıma doğruluğunun arttığı anlamına gelmez.

Değerlendirme ve Kapanış

Özet: Yumuşatma ve Keskinleştirme

Kavram Yumuşatma Keskinleştirme
Amaç Gürültü azaltma, ayrıntıları sadeleştirme Kenar ve ayrıntıları öne çıkarma
Frekans Alçak geçiren: hızlı değişimi bastırır Hızlı değişimi (detay) çıkarıp ekler
Temel mantık Pikseli komşularına yaklaştırma Pikselin komşularından farkını vurgulama
Örnek yöntemler Ortalama, Gauss, Medyan, Bilateral Laplasyen, Unsharp, High-Boost
Dikkat Gerçek ayrıntı da silinebilir Gürültü, halo ve clipping artabilir

Keskinleştirme yumuşatmanın matematiksel tersi değildir; kaybolan bilgiyi geri getirmez.

Kavramları Ayırmak

İşlem Temel çıktı Sabit iç bölge
Normalize doğrusal yumuşatma Yerel ağırlıklı ortalama Korunur
Medyan / bilateral Doğrusal olmayan yumuşatma Korunur
Laplasyen İşaretli detay tepkisi Sıfır
Unsharp Kaynak + ölçeklenmiş detay Korunur
\(Af-f_b\) Kazancı değiştirilmiş kaynak + detay \((A-1)c\)

Yumuşatma, detay çıkarma ve keskinleştirme farklı amaçlara hizmet eder.

Kısa Sorular

  1. Çekirdek toplamı 0 ise sabit bir iç bölgenin çıktısı ne olur?
  2. Tek parlak piksel hangi koşulda gürültü, hangi koşulda korunacak nesnedir?
  3. Medyan neden sabit bir konvolüsyon çekirdeğiyle ifade edilemez?
  4. Temiz görüntüyü bulanıklaştırarak hesaplanan PSNR neden gürültü giderme başarısı değildir?
  5. \(Af-f_b\) formülünde \(A=1\) neden keskinleştirilmiş kaynak görüntüyü vermez?

Sonraki Ders: Kenar Bulma

Yumuşatma gürültü ile ayrıntı arasında bir denge kurar. Türevler yoğunluk değişimlerine tepki verir; keskinleştirme bu tepkileri kaynak görüntüye geri ekler.

Bir sonraki soru: Bu değişimlerden nesne sınırlarını temsil eden bir kenar haritası nasıl elde edilir?

Kaynaklar