Morfolojik Görüntü İşleme

Morfolojik görüntü işleme şekillerin biçimsel yapısı ile ilgilenerek nesneleri ayırt etmemize ve gruplayabilmemize olanak sağlar. Yöntem gri seviye görüntüler üzerinde de çalışsa da genellikle siyah-beyaz (ikili) görüntüler üzerinde kullanılır. Morfolojik filtreler genelde iki temel işlemden türetilmiştir. Bunlar erosion ( aşındırma ) ve dilation ( genişletme ) işlemleridir. Aşındırma ikili bir görüntüde bulunan nesnelerin boyutunu seçilen yapısal elemente bağlı olarak küçültürken, genişletme nesnenin alanını artırır. Bu işlemlerden erosion işlemi birbirine ince bir gürültü ile bağlanmış iki veya daha fazla nesneyi birbirinden ayırmak için kullanılırken, dilation işlemi ise aynı nesnenin bir gürültü ile ince bir şekilde bölünerek ayrı iki nesne gibi görünmesini engellemek için kullanılır.

Özellikle plaka tanıma, harf tanıma, parmak izi tanıma gibi işlemlerde kullanılarak gürültülerin etkisi azaltılır.

İşlemleri matematiksel olarak ifade etmek ve anlamak için fit ve hit gibi iki fonksiyonu anlamamız gereklidir. Bu fonksiyonlardan fit fonksiyonu yapısal elementin elemanları ile elemanların o anda üzerinde bulunduğu pikseller ile tam olarak örtüşmesi durumudur. Yani işlemi mantıksal ve işlemi ile benzetebiliriz. Benzer şekilde hit fonksiyonu da mantıksal veya işlemi ile bağdaştırılabilir. Hit olması için yapısal elementin elemanları ile o an üzerinde bulunduğu piksellerin en az birinin örtüşmesi yeterlidir. Erosion işlemi için karşılıklı piksellerin fit olması gerekirken, dilation işlemi için hit olması yeterlidir. Aşağıda bir görüntü için görüntünün bir kısmına morfolojik işlem uygulanması anlatılmaktadır. Resimde mavi ile gösterilen bölgeler hit, beyaz ile gösterilen bölgeler ise fit olduğu yerleri göstermektedir. Fit veya hit olmaması durumuda siyah renk ile gösterilmiştir. Gösterilen işlemin tüm resim üzerine uygulanması sonucu mavi ile oluşan görüntü dilation sonucunu, beyaz ile oluşan görüntü ise erosion işleminin sonucunu gösterecektir. (İşlem için sarı ile gösterilen noktaları 1 diğer noktaları 0 olan yapısal element kullanılmıştır.)


Bu iki temel yapısal işlem için yaılan C++ kodu aşağıda verilmiştir. Programda yapısal element dışarıdan vektör olarak  ve boyutu da vektör uzunluğunu karekökü (yapısal element kare bize bir kenar uzunluğu lazım) olacak şekilde programa girdi olarak verilmiştir. Programın girdisi ikili seviye olduğu için RGB renk uzayında işlemler sadece R kanalında yapılmıştır. (Diğer kanallarda aynı) Ancak çıktı görüntünün doğru gözükmesi için 3 kanalda aynı olacak şekilde her kanala yazılmıştır. Kod içerisinde sum+= yazılı yerlerde yapısal eleman ile karşılıklı düşen piksel değerleri çarpılarak toplanmıştır. Fit işlemi için bu toplamın yapısal eleman içerisindeki 1sayısı ile 255 in çarpımına eşit olması gerekmektedir. Hit işlemi içinse bu toplamın 254 den büyük olması yeterlidir.


BMP  resim_ero(BMP kaynak,byte* strel,byte strellen) {
   
  BMP im=yenim_bmp(kaynak.bminfo.width,kaynak.bminfo.height);
  int i,j,m,n;
  dword sum=0;
  byte sumstrel=0;
  for(i=0;i strellen*strellen;i++) {sumstrel+=*(strel+i);}        
   
  for (i=0;i < kaynak.bminfo.width-strellen;i++) {
       for (j=0;j <  kaynak.bminfo.height-strellen;j++) {

           for (m=0;m <  strellen; m++) {
               for(n=0;n  < strellen; n++) {
   
                   sum+=kaynak.pixels[i+m][j+n].red*(*(strel+m*strellen+n));
               } 
            }
            if (sum==sumstrel*255) {
                                   
               im.pixels[i+(byte)(strellen/2)][j+(byte)(strellen/2)].red = 255;
               im.pixels[i+(byte)(strellen/2)][j+(byte)(strellen/2)].green = 255;
               im.pixels[i+(byte)(strellen/2)][j+(byte)(strellen/2)].blue = 255; 
            }
               sum=0;
         }
   }
          
   return im;     
 }

Dilation C++ Kodu:


BMP  resim_dil(BMP kaynak,byte* strel,byte strellen) {
   
  BMP im=yenim_bmp(kaynak.bminfo.width,kaynak.bminfo.height);
  int i,j,m,n;
  dword sum=0;       
   
   for (i=0;i <  kaynak.bminfo.width-strellen;i++) {
       for (j=0;j  < kaynak.bminfo.height-strellen;j++) {

           for (m=0;m  < strellen; m++) {
               for(n=0;n  < strellen;n++) {
   
                   sum+=kaynak.pixels[i+m][j+n].red*(*(strel+m*strellen+n));
               }
           }
           if (sum>254) {
                                   
              im.pixels[i+(byte)(strellen/2)][j+(byte)(strellen/2)].red = 255;
              im.pixels[i+(byte)(strellen/2)][j+(byte)(strellen/2)].green = 255;
              im.pixels[i+(byte)(strellen/2)][j+(byte)(strellen/2)].blue = 255; 
           }
           sum=0;
        }
    }
    
    return im;       
}

Bu işlemlerin haricinde morfolojik görüntü işleme altında bu fonksiyonlardan türetilmiş çok sayıda fonksiyon bulunmaktadır. En sık kullanılan diğer iki morfolojik işlem aşağıda anlatılmıştır.


Açma İşlemi(Opening):

Açma işlemi görüntü üzerine önce erosion ardından dilation işlemi uygulanması ile gerçekleştirilir. Aşındırma ile küçük parçalar yok edildikten sonra dilation ile görüntü tekrar genişletilerek küçük parçaların kaybolması sağlanır.

Kapama İşlemi(Closing):

Açma işleminde uygulanan adımların tersten uygulanmasıdır. Böylece görüntü içerisindeki ayrık parçalar birbirine yaklaşır.

Son olarak yine bir uygulama ile bitirelim. Verilen bir görüntüyü ikili seviyeye dönüştürdükten sonra görüntü içerisindeki nesnenin konturunu çıkartalım. Kontur çıkartmak için ikili görüntüyü 1 piksel aşındırdıktan sonra görüntünün aşındırılmamış ilk halinden bu yeni değeri çıkartacağız. Böylece elimizde verilen görüntüye ait yalnızca nesneyi çevreleyen 1 piksel kalınlıkta bir çizgi (kontur) kalacak.


resim=resim_acm("araba.bmp");

resim=resim_iki(resim,otsus_esi(resim));
resim_yaz(resim,"arabaikili.bmp");

yeni=resim_ero(resim,str,3);
     
for(int i=0;i <  resim.bminfo.width;i++) {
   for(int j=0;j < resim.bminfo.height;j++) {
       yeni.pixels[i][j].red=resim.pixels[i][j].red-yeni.pixels[i][j].red;
       yeni.pixels[i][j].green=resim.pixels[i][j].green-yeni.pixels[i][j].green;    
       yeni.pixels[i][j].blue=resim.pixels[i][j].blue-yeni.pixels[i][j].blue;                          
    }
}
          
resim_yaz(yeni,"arabakontur.bmp");
resim_sil(yeni);

Yapılan işlem sonucu oluşan görüntüler aşağıdadır. Görüntü üzerinde 3x3 bir yapısal element kullanılarak 1 piksel genişlikte kontur  elde edilmiştir.

orjinal resim

otsu eşik değeri

kontur

7 yorum:

  1. Kardeşim bu böyle olmaz. Sen sitene reklam falan koy biz tıklayalım. Sonra server kirasını ödeyemedim falan dersin ben dayanamam :D

    YanıtlayınSil
  2. en güzel anlatım bu. Allah razı olsun

    YanıtlayınSil
  3. ya söyleycek kelime bulamıyorum gerçekten emek yani Allah senden razı olsun kardeşim ellerine sağlık selametle kalın hocam

    YanıtlayınSil
  4. dilation işlemi için hit olması yeterlidir.>> yazınız iyi hoş da bir de şu türkilizce değil de türkçeyi güzel kullansanız daha iyi olmaz mı? yani yazınız good ama anladım biçiminiz bad....demek istediğimi anladınız mı? dilimize sahip çıkalım

    YanıtlayınSil
    Yanıtlar
    1. Yazı içerisinde kırmızı ile yazdığım kelimeler derslerde de kullanılan terimler olduğu için Türkçeye çevirmeden (daha anlaşılır olması için) kullanmış tım. Yeni yazılarımda daha dikkatli davranmaya çalışıyorum. Ancak yazıları genellikle kısa sürelerde yazmam gerektiğinden böyle hatalar olabiliyor. Sonraki yazılarımda (yazabilirsem) daha dikkatli olacağım.

      Sil
  5. Emeğinize sağlık hocam

    YanıtlayınSil

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