2. ünite / 12
Nokta işlemleri ve histogram: parlaklık, karşıtlık, gama, eşitleme
g = α·f + β, gama düzeltmesi, bakış tablosu (LUT), histogram, eşitleme ve CLAHE.
Bu ünitenin sonunda
- Parlaklık, karşıtlık ve gamayı bir piksel dönüşümü olarak yazmak
- Histogramdan bir görüntünün karanlık, aydınlık ya da düşük karşıtlıklı olduğunu okumak
- Histogram eşitlemenin birikimli dağılımla nasıl çalıştığını açıklamak
- Global eşitleme ile CLAHE arasında seçim yapmak
Ders notları
Nokta işlemi, her pikselin yeni değerinin yalnız kendi eski değerine bağlı olduğu dönüşümdür. Komşulara bakılmaz; bu yüzden 256 girişlik bir bakış tablosu (LUT) ile çok hızlı yapılır.
α karşıtlığı (eğim), β parlaklığı (kaydırma) belirler. Sonuç 0–255 dışına çıkarsa doyurulur (kırpılır): bilgi kaybolur. Gama doğrusal değildir: γ < 1 koyu tonları açar, açıkları az değiştirir. Kameralar ve ekranlar zaten gama ile çalışır.
Histogram
Histogram her gri değerden kaç piksel olduğunu sayar. Sola yığılmış histogram karanlık, sağa yığılmış aydınlık, dar bir tepe düşük karşıtlıklı görüntü demektir. Histogram konumu söylemez: iki çok farklı görüntünün histogramı aynı olabilir.
Eşitleme
Histogram eşitleme, birikimli dağılımı (CDF) dönüşüm olarak kullanır: g = 255 · (CDF(f) − CDFmin) / (N − CDFmin). Sık görülen değerler arasına daha çok aralık açılır, dar histogram yayılır. Gürültüyü de büyütür. CLAHE görüntüyü karolara bölüp her karoda sınırlandırılmış eşitleme yapar; yerel ayrıntı için daha iyidir.
Oyun alanı
Parlaklık, karşıtlık, gama ve histogram
Her piksel kendi başına dönüşür: g = α·f + β, sonra gama. Histogram altta: önce (gri) ve sonra (renkli). Histogram eşitlemeyi açıp dar bir histogramın nasıl yayıldığını gör.
Kendin dene
Loş sahneyi aç: histogram nerede yığılmış? Önce yalnız α ve β ile şekilleri seçilir yap, sonra sıfırla ve yalnız gama ile dene. Son olarak eşitlemeyi aç: önce/sonra histogramlarını karşılaştır ve sağ alttaki standart sapma değerinin kaç kat arttığını yaz. α = 3 yapınca açık şekillerde ne kayboldu?
Kod
import cv2
import numpy as np
img = cv2.imread('girdi.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
alpha, beta = 1.4, -30 # karşıtlık ve parlaklık
lin = cv2.convertScaleAbs(gray, alpha=alpha, beta=beta) # doyuma kırpar, taşmaz
gamma = 0.6 # < 1 karanlıkları açar
lut = np.array([((i / 255.0) ** gamma) * 255 for i in range(256)]).astype(np.uint8)
gam = cv2.LUT(gray, lut) # 256 girişlik tablo: hızlı
hist = cv2.calcHist([gray], [0], None, [256], [0, 256]).ravel()
print('en sık gri değer:', int(hist.argmax()))
eq = cv2.equalizeHist(gray) # birikimli histogramı düzleştirir
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)).apply(gray)
for name, im in [('gray', gray), ('lin', lin), ('gamma', gam), ('eq', eq), ('clahe', clahe)]:
print(f'{name:6s} min={im.min():3d} max={im.max():3d} std={im.std():5.1f}')
cv2.imwrite('cikti.png', np.hstack([gray, eq, clahe]))Sık yapılan hatalar
- NumPy ile img * 1.5 yapıp uint8'e çevirmek: 255'i aşan değerler sarar. cv2.convertScaleAbs ya da np.clip kullan.
- Eşitlemeyi renkli görüntünün üç kanalına ayrı ayrı uygulamak: renk dengesi bozulur. Parlaklık kanalında (YCrCb'de Y, LAB'de L) eşitle.
- Histogram aynıysa görüntülerin benzer olduğunu sanmak: histogram uzamsal bilgi taşımaz.
- Her probleme eşitleme uygulamak: zaten iyi pozlanmış görüntüde gürültüyü büyütür; ölçüm yapacaksan karşılaştırılabilirliği bozar.
Yazılım mühendisliği bağlantısı
Bakış tablosu klasik bir ön hesaplama örneğidir: pahalı bir fonksiyonu (üs alma) 256 kez hesapla, milyonlarca kez oku. Bu desen gömülü ve gerçek zamanlı yazılımda her yerdedir.
- LUT'u saf bir fonksiyonla üret ve test et: monotonluk, uç değerler (0 → 0, 255 → 255 γ için).
- Parametreleri (α, β, γ) koda gömme, yapılandırmaya taşı; sahadaki kamera değişince yeniden derlemek gerekmesin.
Kendini sına
g = 2·f + 10 dönüşümünde f = 130 olan bir pikselin uint8 sonucu nedir (doyurmalı)?
Histogramın tamamı 20–70 arasında olan bir görüntü için en doğru tarif hangisi?
γ = 0,5 olan gama dönüşümü (g = 255·(f/255)^γ) ne yapar?
CLAHE'nin global eşitlemeye göre üstünlüğü nedir?