Otsu Metodu ile Adaptif Eşikleme

Eşikleme yada ikili tonlama gri tonlanmış bir resmin siyah-beyaz (ikili) uzaya dönüştürülmesi işlemidir. Siyah-beyaz görüntüler, görüntü üzerindeki renklerin pek önemli olmadığı, görüntü üzerinde belirli şekillerin veya dizilerin arandığı uygulamalarda işlem yükünü hafifletmek ve görüntü üzerinde mantıksal (0-1) işlemleri hızlı bir şekilde yapabilmek için sıklıkla kullanılan görüntülerdir. Basitçe gri seviye bir görüntü üzerinde 0-255 arasında seçilen bir T eşik değerine göre, siyah-beyaz resim aşağıdaki şekilde oluşturulur.




Burada T değerinin doğru seçilmesi kritik önem taşımaktadır. Eğer T değeri çok büyük seçilirse oluşturulacak yeni görüntüde pek çok piksel beyaz(1), küçük seçilirse de siyah(0) olacağından görüntünün içerdiği bilgi ciddi miktarda azalacaktır. Birkaç resim için ideal eşik değeri deneme yoluyla bulunabilse de farklı ışık ortamlarında çekilmiş çok sayıda görüntü için bu söz konusu olamaz. Bu nedenle girdi resmine karşılık eşik değerini otomatik olarak hesaplayan bir algoritma gerekmektedir. Nobuyuki Otsu (1979) tarafından geliştirilen Otsu metodu ile eşik değeri görüntü üzerinden hesaplanmaktadır. Metod görüntü üzerinde iki ayrı sınıf(plan) olduğunu kabul ederek, bu iki sınıf arasındaki varyansı maksimum yapacak değeri bulmaya çalışır. Varyans bir dizinin elemanlarının dizinin ortalamasına olan uzaklıklarının karelerinin ortalamasıdır. Bu değere bakarak dizi içerisindeki değerlerin ortalamaya ne derece yakın olduğu görülebilir. Aşağıda $N$ uzunluklu bir dizi için varyans hesaplama formülü verilmiştir.
$$\sigma^2=\sum_{i=0}^{N-1} (x_i-\mu_x)Pr\{x_i\}$$
Yukarıdaki ifadede $Pr\{x_i\}$ ifadesi $x_i$' nin gelme olasılığıdır. Düzgün dağılımlı $N$ uzunluklu bir dizi için bu değer $1/N$ dir. $M\times N$ bir görüntü için konuşacak olursak histogram dizisi hesaplandıktan sonra $i$ tonunun gelme olasılığı histogram[i]/(MxN) dir.

Sınıflar arası varyans ( siyah-beyaz sınıfları ) aşağıdaki formül ile bulunur. $$\sigma_s=\sigma-\sigma_b=\omega_1(t)\omega_2(t)(\mu_1(t)-\mu_2(t))$$
Burada $\omega$ değişkenleri sınıf yoğunluklarını, $\mu$ değişkeleri ise ağırlıklı sınıf ortalamarını göstermektedir ve $X(i)$ $i.$ renk seviyesidir. Bu değerler aşağıdaki formüller yardımıyla hesaplanır. $$\omega_1(t)=\sum_{i=0}^tPr\{i\} \;\; \omega_2(t)=\sum_{i=t+1}^{255}Pr\{i\}$$ $$\mu_1(t)=\sum_{i=0}^tPr\{i\}X(i) \;\; \mu_1(t)=\sum_{i=t+1}^{255}Pr\{i\}X(i)$$

Yazılan program, t=0 ilk değer ile başlayarak 255 e kadar her değer için sınıflar arası varyansı hesaplamakta ve en son maksimum varyans değerini veren t değerini T (eşik değeri) olarak döndürmektedir. Algoritma gri seviyeli görüntüler üzerinde çalıştığından önce görüntü gri=0.3*kırmızı+0.59*yeşil+0.11*mavi formülü ile gri seviye tonlanmış ardından hesaplamalar yapılmıştır.

int i,j;  
int *histogram;
double ag1,ag2,ort1=0,ort2=0,sigma=0,agtop=0,toplam,toplam2;
unsigned char esik;
double agortalama[256];
histogram = new int [256];
    
/* Önce resmi gri seviye kodla ve histogramı hesapla */    
for( j=0 ; j  <  kaynak.bminfo.height ; j++)  {
    for( i=0 ; i  <  kaynak.bminfo.width ; i++)  {     
         unsigned char gri_seviye = 0.3*kaynak.pixels[i][j].red+0.59*kaynak.pixels[i][j].green+0.11*kaynak.pixels[i][j].blue;
         histogram[gri_seviye]++;
    }
}
    
agtop = kaynak.bminfo.width*kaynak.bminfo.height;

for( j=0; j < 256;j++) { toplam2 += j*histogram[j]; } 
          
for(j=0;j < 256;j++) {     
       ag1 += histogram[j];
       if(ag1==0) { continue; }
       ag2 = (agtop-ag1);
       if(ag2==0) { break; }
         
       toplam += (double) j*histogram[j];
         
       ort1=toplam/ag1;
       ort2=(toplam2-toplam)/ag2;
         
       double sigmakare=ag1*ag2*(ort1-ort2)*(ort1-ort2);
         
       if(sigmakare>sigma) { 
         sigma=sigmakare;
         esik=j;           }         
}
return esik;
Son olarak bir uygulama ile bitirelim.

resim=resim_acm("lena.bmp");

resim_75      = resim_iki(resim,75);
resim_180     = resim_iki(resim,180);
resim_adaptif = resim_iki(resim,otsus_esi(resim));

resim_yaz(resim_75,"lena_az.bmp");
resim_yaz(resim_180,"lena_cok.bmp"); 
resim_yaz(resim_adaptif,"lena_kk.bmp");
Yukarıda bahsettiğim üzere, aşağıda seçilen eşik değerinin işlemin sonucuna olan etkisi görünmektedir. İkinci resim T=75 eşik değeri ile eşiklendiğinden yüz kısmında bulunan pek çok veri kaybolmuş, üçüncü resim yüksek bir eşik değeri T=180 ile eşiklendiğinden neredeyse tüm bilgiler kaybolmuştur. Son resim ise adaptif eşik değeri bulunarak T=115 eşiklenmiştir ve resim üzerindeki pek çok bilgi korunmuştur.


12 yorum:

  1. Sınıflar arası varyansı bulurken ki t değerini neye göre belirlediniz

    YanıtlayınSil
    Yanıtlar
    1. Formülde gösterilen T değeri, kod içerisinde görülen j=0 -> 255 döngüsü ile tek tek denenerek, sınıflar arası varyansı maksimum yapan j = T olarak belirlenmiştir.

      Sil
  2. Selamın Aleyküm Kardeşim
    Bu anlatmış olduğun konuyla ilgili bir ödevim var gerçekleştirmem gerek yardımcı olabilirsen çok sevinirim.Çok güzel bir anlatım olmuş ama bitürlü gerçekleştiremedim.
    Ödevim : OTSU yöntemini MATLAB’ta gerçekleştiren m-file fonksiyonunu yazınız?

    YanıtlayınSil
  3. Aleykümselam, burada verdiğim algoritma doğrudan MATLAB e uyarlanabilir bir algoritma, yazdığınız kodu gönderirseniz üzerinde düzeltmeler yapmaya çalışırım.

    YanıtlayınSil
  4. merhaba,

    çalışmalarınız için teşekkür ederim. çok faydalı. otsu metodu algoritmanızda 3. for döngüsünde for( j=0; j <255;j++) yazmışsınız. bir alttaki for döngüsünde j<256 yazmışsınız. 3. for dada j<256 olması gerekmez mi? selamlar.

    YanıtlayınSil
    Yanıtlar
    1. Merhabalar, yorumunuz için teşekkür ederim.

      Kesinlikle haklısınız, 3. for döngüsünün üs sınırı 255 olmalı. Kodda gerekli değişiklikleri yaptım. Uyarınız ve dikkatiniz için ayrıca teşekkür ederim.

      Sil
    2. rica ederim. yerli bir sitede Türkçe olarak bu içeriği görmek beni çok mutlu etti. yemeği pişirmişsiniz zaten. bizimde 1 tuz tanemiz olsun.

      Sil
  5. kaynak dediğiniz nedir hocam ?

    YanıtlayınSil
  6. Merhaba;
    Kodun tam çalışan halini atabilir misiniz ve dword değerleri ne anlama geliyor?

    YanıtlayınSil
  7. /* Önce resmi gri seviye kodla */
    bu yorum satırının altında histogram adlı dizi ileişlem yapmıssınız ya, ordaki histogram dizisinde histogram degerlerı yok mu, anlamadıgım bı kac yer daha var da yardımcı olur musunuz ,su an bende resmı otsu alg. ile binary formata donusturmeye calısıyorum...Sağolun yazı için.

    YanıtlayınSil
    Yanıtlar
    1. İlgili satırda resim 0.3, 0.59, 0.11 ağrırlıkları kullanılarak gri seviyeye dönüştürülüyor ve ardından histogram hesabı yapılıyor. For döngülerinin sonunda histogram dizisinde 0-255 arası gri seviye değerlerin oluşma sıklığı bulunuyor. İlgili satırları ve bazı değişkenleri daha kolay anlaşılması için değiştirdim. Anlamadığınız diğer noktaları da yazarsanız yazıyı güncelleyebilirim.

      Sil

Görüntü işleme ile ilgili yeni yazıları ve bu sitede yer alan yazıların güncellenmiş sürümlerini www.imlab.io veya cescript.github.io adreslerinden takip edebilirsiniz.

X