3. ünite / 12
Eşikleme: sabit eşik, Otsu ve uyarlamalı eşik
Griden ikiliye: elle eşik, Otsu'nun sınıflar arası varyansı, düzensiz ışıkta uyarlamalı eşik.
Bu ünitenin sonunda
- Sabit eşiklemeyi ve ters eşiklemeyi uygulamak
- Otsu yönteminin hangi büyüklüğü en büyük yaptığını açıklamak
- Düzensiz aydınlatmada uyarlamalı eşiğin neden kazandığını göstermek
- Blok boyu ve C parametresini sonuca bakarak ayarlamak
Ders notları
Eşikleme, gri bir görüntüyü ikili (siyah-beyaz) maskeye çevirir: piksel eşikten büyükse 255, değilse 0. Konturlar, morfoloji ve sayım gibi sonraki adımların çoğu ikili görüntü ister.
Otsu
Elle eşik seçmek her görüntüde yeniden ayar demektir. Otsu histogramdaki her olası eşik t için pikselleri iki sınıfa ayırır ve sınıflar arası varyansı hesaplar; en büyük olanı seçer:
ω sınıfların oranı, μ ortalamalarıdır. İki tepeli (nesne ve zemin) histogramda iki tepenin arasındaki vadiyi bulur. Tek tepeli ya da ışığın görüntü boyunca değiştiği durumlarda başarısız olur.
Uyarlamalı eşik
Işık soldan sağa azalıyorsa sağdaki beyaz kâğıt soldaki siyah yazıdan koyu olabilir; hiçbir tek eşik işe yaramaz. Uyarlamalı eşik her pikseli kendi komşuluğunun ortalamasıyla karşılaştırır: f(x, y) > ortalamablok(x, y) − C. Blok, yazı kalınlığından büyük olmalı; C küçük gürültünün beyaz kalmasını sağlar. Ortalama integral görüntüyle her piksel için sabit sürede hesaplanır.
Oyun alanı
Eşikleme: sabit, Otsu, uyarlamalı
Gri görüntüyü siyah-beyaza çevir. Sabit eşikte değeri sen seçersin; Otsu histogramdan sınıflar arası varyansı en büyük yapan eşiği bulur; uyarlamalı eşik her pikseli kendi komşuluğunun ortalamasıyla karşılaştırır, düzensiz aydınlatmada kazanır.
Kendin dene
Düzensiz ışıktaki sayfa sahnesinde önce sabit eşikle sayfanın tamamını okunur yapmaya çalış: mümkün mü? Otsu'ya geç ve bulduğu eşiği not et; σB² eğrisinin tepesine bak. Sonra uyarlamalı eşiğe geç: blok 5, 15, 41 ve C 0, 10, 25 değerlerini dene; hangi bileşim harf aralıklarını koruyup zemini temiz bıraktı?
Kod
import cv2
import numpy as np
img = cv2.imread('girdi.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, fixed = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
t, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print('Otsu eşiği:', t) # verilen 0 yok sayılır
blur = cv2.GaussianBlur(gray, (5, 5), 0) # önce gürültüyü azalt
adapt = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 31, 10) # blok 31 piksel (tek), C = 10
for name, m in [('fixed', fixed), ('otsu', otsu), ('adaptive', adapt)]:
print(name, 'beyaz oranı:', round((m > 0).mean(), 3))
cv2.imwrite('cikti.png', np.hstack([fixed, otsu, adapt]))Sık yapılan hatalar
- Eşiklemeden önce bulanıklaştırmamak: gürültü her yerde küçük beyaz noktalar bırakır.
- Uyarlamalı eşikte çift sayılı blok boyu vermek: OpenCV tek sayı ister (3, 5, 7…), aksi hâlde hata verir.
- Otsu'yu renkli görüntüye vermek: yalnız tek kanallı uint8 görüntüde çalışır.
- Koyu nesne açık zemindeyken THRESH_BINARY kullanıp nesnenin siyah çıkmasına şaşırmak: THRESH_BINARY_INV gerekir.
Yazılım mühendisliği bağlantısı
Eşik gibi "sihirli sayılar" sahada en çok bozulan şeydir. Otsu ve uyarlamalı eşik, sabiti veriden türeterek bu kırılganlığı azaltır.
- Bir altın görüntü seti tut (farklı ışık, farklı kâğıt) ve her değişiklikte sonucu bunlarda karşılaştır: piksel doğruluğu ya da IoU.
- Parametre aramasını elle değil, küçük bir ızgara taramasıyla yap ve sonucu kaydet.
Kendini sına
Otsu yöntemi hangi büyüklüğü en büyük yapan eşiği seçer?
Işığın görüntü boyunca güçlü biçimde değiştiği bir sayfada hangi yöntem en iyi sonuç verir?
cv2.adaptiveThreshold'da C parametresi artırılınca ne olur?
Açık zeminde koyu yazıyı beyaz (255) olarak almak için hangi bayrak kullanılır?
Bu üniteden sonra bitirme projesinde
- Öneri ve test seti: Kapsam, gereksinimler (G1–G6) ve 20 fotoğraflık altın set: her fotoğrafta köşeler elle işaretlenmiş (JSON).
