21.3.05

OpenCV ile görüntü işlemeye giriş

bir önceki yazımda, OpenCV'nin Visual Studio 6.0 ile birlikte nasıl kullanılacağından bahsetmiştim. bu yazıda, yeni başlayanlar için OpenCV kullanarak nasıl kod yazılacağına dair bir örnek vereceğim.

yazdığım kod 4 adet işlemi gerçeklemektedir:
  1. Threshold I
    threshold: Türkçesi eşikleme. genellikle görüntü işlemedeki karşılığı, resmin belirli bir değerden(threshold value/eşik değeri) daha küçük değere sahip pixellerin siyaha, daha büyük değere sahip pixel değerleri beyaza boyanmasıdır.
    resmin sol üst köşesinden başlayıp, pixel pixel taranır. pixelin değeri eşik değerimizden küçükse 0, değilse 255 yapılır. ilgili kod:
    for(i=0;i<src->height;i++){
    for(j=0;j<src->width;j++){
    src_pixel_ptr = CV_MOVE_TO(pos_src,i,j,1);
    dst_pixel_ptr = CV_MOVE_TO(pos_dst,i,j,1);
    src_pixel_ptr[0]<thresh_val?
    dst_pixel_ptr[0]=0:dst_pixel_ptr[0]=255;
    }
    }

  2. Threshold II
    OpenCV'nin threshold fonksiyonu kullanarak gerçekleştirilen thresholding işlemi. kod:
    cvThreshold( src, dst, thresh_val, 255, CV_THRESH_BINARY);

    ne kadar da basit değil mi?
  3. Sharpen Filter
    3x3'lük bir sharpen kernelinin uygulanması işlemi. uygulanan kernel:
     0 -1  0
    -1 5 -1
    0 -1 0

    kod:
    // kernel icin gerekli alani ayir
    kernel = cvCreateMat(9,9,CV_32FC1);
    //kerneli in$a et
    cvSet2D( kernel, 0, 0, cvRealScalar(0) );
    cvSet2D( kernel, 0, 1, cvRealScalar(-1) );
    cvSet2D( kernel, 0, 2, cvRealScalar(0) );
    cvSet2D( kernel, 1, 0, cvRealScalar(-1) );
    cvSet2D( kernel, 1, 1, cvRealScalar(5) );
    cvSet2D( kernel, 1, 2, cvRealScalar(-1) );
    cvSet2D( kernel, 2, 0, cvRealScalar(0) );
    cvSet2D( kernel, 2, 1, cvRealScalar(-1) );
    cvSet2D( kernel, 2, 2, cvRealScalar(0) );
    // filtreyi/kerneli uygula
    cvFilter2D( src, dst, kernel, cvPoint(-1,-1) );

  4. 5x5 Median Filter
    Median Filter şu biçimde çalışır:
    1. nxn'lik bir pencere oluştur ve sol üst köşeden başla
    2. pencerenin içinde kalan değerleri sırala.
    3. pencerenin tam ortasındaki pixel'in değerine, sıralanmış değerlerin ortadakini ata.
    4. resimin sonuna gelinmemişse pencereyi kaydır ve 2'ye git.
    5. dur
    nxn boyutundaki pencerenin tam ortasındaki değerden bahsedebilmemiz için, n tek olmalıdır. kod:
    cvSmooth( src, dst, CV_MEDIAN, 5, 0, 0 );
gerekli dosyalar:
  • opencv_1.cpp - yukarıda bahsedilen işlemlerin gerçeklendiği C++ dosyası.
  • Lena'nın resmi ;)
    Lena, görüntü işlemede giriş resmi için yaygın olarak kullanılan bir bayandır. ilk olarak 1973'de kullanılmıştır. ünlü fotoğraf Playboy'un Kasım 1972'de yayınladığı dergiden alınmıştır. daha fazla bilgi için buraya.
    normal resim:


    gürültü eklenmiş resim:


2 yorum:

Erhan Kesken dedi ki...

alakasiz bir yorum olcak ama neyse,
guzel ortam yapmisin abi kendine, bi hayirli olsun deyim dedim, ben de actim dukkani, yakinda hizmetinizdeyiz dolu dizgin,
su anda tadilat durumlari malum

"nasil biliriz blog spotu?" diye sorucam, bugun var yarin yok bir ortam degil dimi, benim cok ciddi planlarim var da

Çağlar Gülçehre dedi ki...

Selam blog'una şans eseri rastladım. Bende zamanında OpenCv ile uğraşmıştım. Gerçektende çok güzel ve faydalı kütüphaneler mevzut özellikle görüntü işleme işlemleri için. Bende kendi bloguma ( http://codedanger.blogspot.com/2007/07/opencv-naming-conventions-functions-in.html ) opencv ile ilgili başlangıç niteliği için iyi sayılabilecek bir yazı koymuştum. Tabii ingilizce.