Nano'nun Günlüğü…

Ideallerimi gerceklestirmek icin arastiriyorum, Unutmamak icin yaziyorum!

  • Bulundugunuz Sayfa: 
  • Ana Sayfa
  • OpenCv ile Image Processing Uygulamasi

OpenCv ile Image Processing Uygulamasi

Gönderim Temmuz 28th, 2013

Bu makale iceriginde Suleyman Demirel Universitesi – Bilgisayar Muhendisligi bolumu’nun Paralel Programlama dersi icin gelistirilen OpenCv ile Image Processing Uygulamasi C programlama dili ile birlikte kullanilarak yapilmis bir ornegini paylasiyor olacagim.

 

ImageProcessing.Cpp

#include “opencv2/imgproc/imgproc.hpp”
#include “opencv2/highgui/highgui.hpp”
#include <iostream>
#include <conio.h>
#include “opencv\cv.h”
#include “opencv\highgui.h”

IplImage *esasFotograf,*grayscaleFotograf, *binaryFotograf, *erosionFotograf, *dilationFotograf, *convulationFotograf;
IplConvKernel *merkezYapisi;
IplImage *gray, *binary, *image_ciktisi;
static int merkezNoktasi[9] = { 0,1,0, 1,1,1, 0,1,0 };

void EsasFotografinGoruntusuAl();
void GrayScale_IsleminiUygula();
void GrayScale2Binary_IsleminiUygula();
void Erosion_Islemi();
void Dilation_Islemi();
void Convulation_Islemi();

using namespace std;
using namespace cv;

int main()
{
EsasFotografinGoruntusuAl();
GrayScale_IsleminiUygula();
GrayScale2Binary_IsleminiUygula();
Erosion_Islemi();
Dilation_Islemi();
Convulation_Islemi();

if(esasFotograf){
cvNamedWindow( “Esas Fotograf”, 1 );
cvShowImage( “Esas Fotograf”, esasFotograf );
}

if(grayscaleFotograf){
cvNamedWindow( “GrayScale Fotograf”, 1 );
cvShowImage( “GrayScale Fotograf”, grayscaleFotograf );
}

if(binaryFotograf){
cvNamedWindow( “Binary Fotograf”, 1 );
cvShowImage( “Binary Fotograf”, binaryFotograf );
}

if(erosionFotograf){
cvNamedWindow( “Erosion Fotograf”, 1 );
cvShowImage( “Erosion Fotograf”, erosionFotograf );
}

if(dilationFotograf){
cvNamedWindow( “Dilation Fotograf”, 1 );
cvShowImage( “Dilation Fotograf”, dilationFotograf );
}

if(convulationFotograf){
cvNamedWindow( “Convulation Fotograf”, 1 );
cvShowImage( “Convulation Fotograf”, convulationFotograf );
}

cvWaitKey(0);

if(esasFotograf)
cvReleaseImage(&esasFotograf);

if(grayscaleFotograf)
cvReleaseImage(&grayscaleFotograf);

if(binaryFotograf)
cvReleaseImage(&binaryFotograf);

if(erosionFotograf)
cvReleaseImage(&erosionFotograf);

if(dilationFotograf)
cvReleaseImage(&dilationFotograf);

if(convulationFotograf)
cvReleaseImage(&convulationFotograf);
}

void EsasFotografinGoruntusuAl()
{
esasFotograf=cvLoadImage( “..\OpenCvDeneme\\Convulation\\EsasFotograf.jpg”,
CV_LOAD_IMAGE_UNCHANGED );
}

void GrayScale_IsleminiUygula()
{
grayscaleFotograf=cvLoadImage( “..\OpenCvDeneme\\Convulation\\EsasFotograf.jpg”,
CV_LOAD_IMAGE_GRAYSCALE );

image_ciktisi = cvCreateImage(cvSize(grayscaleFotograf->width, grayscaleFotograf->height), 8, 3);
cvCvtColor(grayscaleFotograf, image_ciktisi, CV_GRAY2RGB);
cvSaveImage(“..\OpenCvDeneme\\Convulation\\GrayScaleFotograf.jpg”,
grayscaleFotograf);
}

void GrayScale2Binary_IsleminiUygula()
{
grayscaleFotograf = cvLoadImage( “..\OpenCvDeneme\\Convulation\\GrayScaleFotograf.jpg”);
gray = cvCreateImage(cvSize(grayscaleFotograf->width, grayscaleFotograf->height), IPL_DEPTH_8U,1);
binary = cvCreateImage(cvSize(grayscaleFotograf->width, grayscaleFotograf->height), IPL_DEPTH_8U,1);

binaryFotograf = cvCreateImage(cvSize(grayscaleFotograf->width, grayscaleFotograf->height), IPL_DEPTH_8U,1);
cvCvtColor(grayscaleFotograf, gray, CV_BGR2GRAY);
cvThreshold(gray, binary, 150, 255, THRESH_BINARY);
cvInRangeS(binary, cvScalar(1,0,0), cvScalar(255,0,0), binaryFotograf);

cvSaveImage(“..\OpenCvDeneme\\Convulation\\BinaryFotograf.jpg”, binaryFotograf);
}

void Erosion_Islemi()
{
binaryFotograf = cvLoadImage( “..\OpenCvDeneme\\Convulation\\BinaryFotograf.jpg”);

erosionFotograf = cvCloneImage (binaryFotograf);
merkezYapisi = cvCreateStructuringElementEx (3,3,1,1, CV_SHAPE_CUSTOM, merkezNoktasi);
cvErode(binaryFotograf, erosionFotograf, merkezYapisi, 1);
cvReleaseStructuringElement(&merkezYapisi );

cvSaveImage(“..\OpenCvDeneme\\Convulation\\ErosionUygulanmisFotograf.jpg”, erosionFotograf);
}

void Dilation_Islemi()
{
binaryFotograf = cvLoadImage( “..\OpenCvDeneme\\Convulation\\BinaryFotograf.jpg” );

dilationFotograf= cvCloneImage (binaryFotograf);
merkezYapisi = cvCreateStructuringElementEx (3,3,1,1,CV_SHAPE_CUSTOM, merkezNoktasi);
cvDilate (binaryFotograf, dilationFotograf, merkezYapisi, 1);
cvReleaseStructuringElement(&merkezYapisi );

cvSaveImage(“..\OpenCvDeneme\\Convulation\\DilationUygulanmisFotograf.jpg”,dilationFotograf);
}

void Convulation_Islemi()
{
erosionFotograf=cvLoadImage( “..\OpenCvDeneme\\Convulation\\ErosionUygulanmisFotograf.jpg” );
convulationFotograf= cvCloneImage (erosionFotograf);
merkezYapisi = cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_CUSTOM, merkezNoktasi);
cvDilate (erosionFotograf, convulationFotograf, merkezYapisi, 1);
cvReleaseStructuringElement(&merkezYapisi );
cvSaveImage(“..\OpenCvDeneme\\Convulation\\ConvulationUygulanmisFotograf.jpg”, convulationFotograf);

}

Kod Analizi

Proje uzerinde, OpenCv’ye ait hazir fonksiyonlari kullanmayi tercih ettim. Bircok fotograf uzerinde sonuc almaya calistim. Ki bu fotograflar renk karisikligina gore basit yada zor olarak degismektedir. Yapmis oldugum islemlerde oncelikle secmis oldugum fotografin path’ini belirliyor ve uygulamaya tanitiyorum. Ardindan Okutmus oldugum fotografin ana hatlarina ulasabilmem icin once GrayScale ile duzenliyor ardindan da binary formatlardan olusan bir fotograf yapisina donusturuyorum.

merkezYapisi = cvCreateStructuringElementEx (3,3,1,1,CV_SHAPE_CUSTOM, merkezNoktasi);

Sonrasinda Erosion ve Dilation islemleri icin kullanmam gereken cvCreateStructuringElementEx  fonksiyonuna yonlendirmem gereken CV_SHAPE_CUSTOM parametresine ait bir dizi olusturuyorum. Ki bu olusturmus oldugum diziyi kendisi vermis oldugum boyutlarda bir matrix’e donusturmektedir. Burada cvCreateStructuringElementEx fonksiyonu sayesinde 3X3 ‘luk bir matrix olustmus oluyoruz. Bununla birlikte fotograflarin uzerinde tarama islemi yapilirken bu matrix ‘le calismis olacaktir.

Erosion ve Dilation islemlerini ayri ayri ekrana bastirdiktan sonra Convulation islemi icin Erosion islemine en son uygulanmis fotografi convulation islemi icin tekrar yukluyorum.  Ardindan Erosion ‘a uygulanmis fotograf uzerinde tekrardan Dilation islemini uyguluyorum. Sonuc olarak Convulation fotografi olarak sisteme goruntu kaydedilmis oluyor.

Not; Egerki cvErode ve cvDilate fonksiyonlarinda iterasyon sayisini 1 degil de daha farkli ya da yuksek degerler verdigimde ise, sonuclar yine farkli cikmaktadir.

Image Sonuclari –  Image I

Uygulama icin kullanmis oldugum Esas Fotograf ;

 

 

 

 

 

 

 

Esas fotografin GrayScale islemine uyarlanmis hali ;

 

 

 

 

 

 

 

GrayScale islemine uygulanmis fotografin Binary’e donusturulerek ana hatlarina ulasiliyor;

 

 

 

 

 

 

 

Bundan sonraki islemleri Binary sonucuna sahip olan fotograf uzerinde yapiyor olacagim. Binary ciktisinin uzerinde cvErode islemini uyguladigimda asagidaki gibi bir goruntu elde etmis oluyorum. Bu goruntu uzerinde dikkatlice bakildiginda esas fotografa ait olan binary fotograf goruntusunde ki en belirgin bolgeler daha cok ortaya cikmis oluyor cunku erosion isleminin ardindan siliklesmis olan alanlar hemen hemen yok edilmis oluyor.

 

 

 

 

 

 

 

Esas fotografa ait olan binary haliyle olusturulmus fotograf uzerinde cvDilate islemi uygulanmis hali asagidadir. Burada genisletme islemi yapilarak, esas fotografa ait binary goruntudeki siliklesmis alanlar biraz daha belirgin hatlara sahip olmustur.

 

 

 

 

 

 

 

Convulation islemi icin binary goruntunun erosion haline donusturulmus halini kullaniyorum. Burada asindirma islemine ugramis olan goruntuye genisletme islemi yani dilate islemi uygulanmaktadir. Bu islemle birlikte, Esas fotograf uzerinde siliklesmis alanlari temizleyerek onceki net kisimlari ve sonrasindaki temizlenmis alanlari daha belirgin bir sekilde ortaya cikarmis olmaktadir.

 

 

 

 

 

Image Sonuclari –  Image II

Baska bir ornekte sonuclari inceleyecek olursak;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Keyifli Calismalar Dilerim.

Etiketler: , , , ,
Bulundugu Konu Etiketleri C / C++, OpenCV, Paralel Programlama, Sistem Programlama, Yazilim |

Lutfen Yorumlarinizi Burdan Ulastiriniz!...

You must be Kullanici Adiniz : to post a comment.

Istatistik

  • 1 Uye
  • 334 Yazi
  • 16 Yorum Var