Otsu Algoritması ve Görüntü Eşikleme
Görüntü işleme alanında bir görüntüyü anlamlandırmanın ilk adımlarından biri, onu basitleştirmektir.
Eşikleme (thresholding) bu amaca hizmet eden en temel yöntemlerden biridir; gri tonlu bir görüntüyü siyah-beyaz hale getirerek nesne ve arka planı birbirinden ayırır.
Bu yazıda, görüntü eşikleme sürecinin nasıl çalıştığını ve Otsu algoritmasıyla adaptif (yerel) eşikleme yöntemlerinin farklarını inceliyoruz.
Otsu yöntemi, tüm görüntüye tek bir eşik değeri uygulayarak hızlı bir ayrım yaparken, adaptif yöntem her bölge için farklı bir eşik belirleyerek ışık değişimlerine daha duyarlı sonuçlar üretir.
Her iki yaklaşımı da gerçek bir örnek üzerinde uygulayıp, avantajlarını ve sınırlamalarını karşılaştırarak hangi koşullarda hangi yöntemin daha uygun olduğunu gözlemliyoruz.
Görüntü Eşikleme Nedir?
Eşikleme, bir görüntüdeki pikselleri parlaklık değerine göre iki sınıfa ayırma işlemidir. Bu sınıflar genellikle nesne ve arka plan olarak tanımlanır. Her piksel, belirli bir sınır değeri T ile karşılaştırılır; eğer I(x,y) >= T ise piksel nesneye, aksi halde arka plana ait kabul edilir. Bu şekilde, görüntü yalnızca 0 ve 1 değerlerinden oluşan sade bir biçime dönüşür.
Ancak sabit bir T değeri her görüntüde aynı sonucu vermez. Farklı ışık koşulları, gölgeler veya kontrast değişimleri bu değeri etkiler. Otsu algoritması bu sorunu otomatik olarak çözer. Görüntünün ton dağılımını (histogram) analiz eder ve tüm olası T değerleri için sınıflar arasındaki farkı hesaplar.
Her T için şu adımları uygular:
Piksel gruplarını ikiye ayır:
0..TveT+1..max.Her grubun ortalama parlaklığını ve piksel oranını bul.
Gruplar arası farkı
(mean_total * w - mean)**2 / (w * (1 - w))formuyla değerlendir.
Sonuçta bu farkın en yüksek olduğu T değeri, en iyi eşik olarak seçilir. Yani Otsu, pikselleri iki gruba ayıran en uygun sınırı otomatik bulur. Bu yöntem, özellikle belgelerde yazı tespiti, mikroskop görüntülerinde hücre ayrımı ve net kontrastlı endüstriyel sahnelerde oldukça etkili çalışır.
1. Global Eşikleme (Tek Eşik Yaklaşımı)
Global eşikleme, bir görüntünün tamamına tek bir eşik değeri (T) uygulanmasıyla yapılır. Yani, görüntüdeki tüm pikseller aynı sınır üzerinden değerlendirilir. Bu yöntem, aydınlatmanın dengeli olduğu sahnelerde oldukça iyi çalışır çünkü görüntü boyunca parlaklık dağılımı homojendir.
Ancak tek bir T değeri, farklı ışık koşullarına sahip görüntülerde sorun çıkarabilir. Örneğin, bir bölge gölgede kalmışsa veya yüzey parlaklığı değişiyorsa, bu alanlar hatalı şekilde arka plan olarak sınıflandırılabilir.
Sonuç olarak bazı pikseller yanlışlıkla nesneye, bazıları ise arka plana dahil olur.
Otsu algoritması global bir yöntemdir; bu yüzden çoğu durumda başarılı olsa da çok değişken aydınlatmalı sahnelerde tek başına yeterli olmayabilir.



2. Yerel (Adaptif) Eşikleme
Yerel eşikleme, global yöntemin sınırlamalarını aşmak için geliştirilmiştir. Bu yöntemde görüntü küçük bölgelere (örneğin 15×15 piksellik pencerelere) ayrılır ve her bölge için ayrı bir eşik değeri (T_local) hesaplanır. Her piksel, kendi çevresindeki parlaklık ortalamasına göre değerlendirilir.
Bu yaklaşım, gölge veya yansıma gibi aydınlatma değişimlerinden etkilenmez çünkü her bölge kendi koşullarına göre karar verir. Kod yapısında, her piksel için komşuluk alanı alınır, bu alanın ortalaması veya Gaussian ağırlıklı değeri bulunur ve sabit bir C çıkarılarak eşik belirlenir. Bu şekilde, yerel aydınlatma farkları dengelenmiş olur.
Yerel eşikleme global yaklaşıma göre daha fazla işlem gücü gerektirir, ancak sonuç olarak daha tutarlı ve detay koruyucu bir çıktı üretir.
3. Uygulama ve Sonuçların Değerlendirilmesi
Aşağıdaki çalışmada Otsu algoritmasını ve adaptif (yerel) eşikleme yöntemini aynı görüntü üzerinde uyguladık. İki yöntemi yan yana karşılaştırınca, farklı aydınlatma koşullarında nasıl davrandıklarını daha net görebildik.
3.1 Otsu ile Global Eşikleme
Otsu yöntemi, görüntüdeki ton dağılımını inceleyip tüm sahne için tek bir eşik değeri seçiyor. Aydınlatması dengeli, net kontrastlı görüntülerde bu yöntem oldukça iyi sonuç verdi; nesne ve arka planı temiz bir şekilde ayırdı.
Histogramda Otsu’nun bulduğu eşik çizgisinin iki tepe arasında güzel bir noktaya denk geldiğini gördük. Ama sahnede gölge, parlama ya da ışık farkı varsa, bu tek global eşik bazı bölgeleri yanlış sınıfa koyabiliyor. Örneğin gölgede kalan alanları arka plan olarak algılayabiliyor.



# OTSU ILE GLOBAL ESIKLEME
import cv2 # OpenCV: goruntu isleme fonksiyonlari
import matplotlib.pyplot as plt # Matplotlib: histogram grafigi cizmek icin
import os # OS: dosya yollari ve klasor islemleri icin
image_path = r"C:imgpathsample.jpg" # Esikleme uygulanacak goruntunun tam dosya yolu
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Goruntuyu gri tonlu oku
# Otsu Esik Bulma
otsu_threshold, otsu_img = cv2.threshold(
img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
print(f"Otsu tarafindan belirlenen optimum esik degeri: {otsu_threshold}")
# Histogram grafigini olustur ve kaydet
plt.hist(img.ravel(), 256, [0,256]) # Histogrami ciz
plt.axvline(otsu_threshold, color='r', linestyle='--') # Otsu esigini kirmizi cizgiyle goster
plt.title("Otsu Histogram") # Baslik ekle
plt.xlabel("Piksel Degerleri") # X ekseni etiketi
plt.ylabel("Frekans") # Y ekseni etiketi
# Histogrami kaydet (dosya adi: _hist.png)
histogram_path = output_dir + "\" + base_name + "_hist.png"
plt.savefig(histogram_path) # Dosyayi kaydet
plt.close() # Grafigi kapat
# Otsu sonucu (binary goruntu) kaydet
binary_path = os.path.join(output_dir, f"{base_name}_otsu_binary.png")
cv2.imwrite(binary_path, otsu_img) # Esiklenmis (bimodal) goruntuyu kaydet
# Islem sonucu ozet bilgisi
print("Islem tamamlandi")
print(f"Histogram kaydedildi: {histogram_path}")
print(f"Binary goruntu kaydedildi: {binary_path}")
Adaptif (yerel) eşikleme yönteminde ise işler biraz farklı. Her pikselin çevresine bakarak kendi eşiğini belirliyor, yani görüntüyü küçük küçük alanlarda değerlendiriyor. Bu sayede gölgede kalan ya da fazla aydınlık bölgelerdeki detaylar da korunuyor. Özellikle kontrastın değiştiği alanlarda adaptif yöntemin daha düzgün bir siyah-beyaz ayrımı yaptığını gözlemledik. Tabii bu yöntemin dezavantajı, her bölge için ayrı hesap yapması nedeniyle biraz daha yavaş çalışması.





# ADAPTIF (YEREL) ESIKLEME
import cv2 # OpenCV: goruntu isleme fonksiyonlari
import matplotlib.pyplot as plt # Matplotlib: histogram grafigi cizmek icin
import os # OS: dosya yollari ve klasor islemleri icin
image_path = r"C:imgpathsample.jpg" # Esikleme uygulanacak goruntunun tam dosya yolu
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Goruntuyu gri tonlu oku
# Adaptif (yerel) esikleme islemi
# adaptiveThreshold fonksiyonu, her pikselin esigini kendi bolgesine gore hesaplar.
# blockSize = komsuluk boyutu (ornegin 15 piksel)
# C = ortalamadan cikarilan sabit (kontrast ayari icin)
binary_local = cv2.adaptiveThreshold(
img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize=15, C=5
)
# Histogram grafigini olustur ve kaydet
plt.hist(img.ravel(), 256, [0,256]) # Histogrami ciz
plt.title("Adaptif Esikleme Histogram") # Baslik ekle
plt.xlabel("Piksel Degerleri") # X ekseni etiketi
plt.ylabel("Frekans") # Y ekseni etiketi
# Dosya yollarini belirle
output_dir = os.path.dirname(image_path)
base_name = os.path.splitext(os.path.basename(image_path))[0]
# Histogrami kaydet
histogram_path = output_dir + "\" + base_name + "_adaptive_hist.png"
plt.savefig(histogram_path)
plt.close() # Grafigi kapat
# Yerel (adaptif) binary goruntuyu kaydet
binary_path = os.path.join(output_dir, f"{base_name}_adaptive_binary.png")
cv2.imwrite(binary_path, binary_local)
# Sonuc bilgisi
print("Islem tamamlandi")
print(f"Histogram kaydedildi: {histogram_path}")
print(f"Adaptif binary goruntu kaydedildi: {binary_path}")
Genel olarak baktığımızda, Otsu yöntemi hızlı ve sade sahnelerde işimizi gayet iyi gördü, adaptif eşikleme ise ışığın dengesiz olduğu görüntülerde çok daha kararlı sonuçlar verdi. Bizim için en mantıklı yaklaşım, önce Otsu ile genel bir ayrım yapmak, gerekirse adaptif yöntemle sonucu detaylandırmak oldu.


Çok verimli bir çalışma. Emeğinize sağlık
Teşekkür ederim.
Çok teşekkür ederiz. Eline sağlık.
Rica ederim.