ANASAYFA | BLOG | SORU CEVAP | REFERANSLARIM | DOWNLOAD | HAKKIMDA | İLETİŞİM | ARAMA
C ile PGM RESİM İŞLEME - KÖŞE BULMA

PGM (Portable Gray Map File) formati gri seviyeli resimleri göstermede kullanilan bir formattir. Veriler byte halince tutulur. Renk degerleri 0 dan baslayip 255 e kadar devam eder. Burada 0 ile ifade edilen byte lar siyahi, 255 ile ifade edilen byte lar ise beyaz rengi temsil etmektedirler. Geriye kalan 0-255 arasi renkler ise gri tonlu renkleri temsil etmektedir. Simdi birlikte C kodu ile .pgm formatli resimdeki pixelleri inceleyip belirledigimiz hassassliga göre köseleri kare içerisine aldiracagiz.

/*Kullacacagimiz kütüphaneleri tanimliyoruz*/

#include <stdio.h>

#include <stdlib.h>

#include <math.h>    

#include <time.h>

#include <conio.h>

FK-gizle

/*Kullanacagimiz fonksiyonlari tanimliyoruz*/

void exp_atama(double **r,int j,double sigma,int Mx,int My);

void kare (double **Ia,double **Ib,double **Iz,int i);

void convolution (double **A, double **B, double **C, int M, int N);

void turev (double **Ik,double **Il,double **C,int i);

int main(int argc, char *argv[]){

/*Programda kullanacagimiz degiskenleri tanimliyoruz*/

       double sigma,**A,**B,**C,**Ix,**Iy,**Ixx,**Ixy,**Iyy,**Sxx,**Sxy,**Syy,**R,toplam=0,thr,k=0.04;

       int i,j,M,N,x,y,a,b,Mx,My,value[3],width,height,maxval,*pgm_degerler;

       char str[7],str2[3],*pixel,ch,c1,c2;

       FILE *PGM,*PGMx;

/*Resim dosyamizin adresini belirtiyoruz*/

       PGM=fopen("D:\\resim.pgm","rb");

/*belirttigimiz adreste dosyanin olup olmadigini kontrol ediyoruz*/

       if (PGM == NULL)

       {

             printf("DOSYA YOKK!!!\n");

             return 0;

       }

       else {

             fscanf(PGM, "%c%c", &c1, &c2);

             if (c1 != 'P' || (c2 != '2' && c2 != '5')) {

                    printf("Dosya tipi PGM DEGILLL!!!\n");

                    fclose(PGM);

                    return 0;

             }

       }

/*Dosyayi okuyup üzerinde degisiklik yapmaya basliyoruz*/

       for (j=0; j<3; j++) {

             do {

                    i=0;

                    ch = fgetc(PGM);

                    if (ch == '#') do {

                           str[i++]=fgetc(PGM);

                    } while (str[i-1]!= 'n');

                    str[i]=0;

             } while(ch < '0' || ch > '9');

             i = 0;

             str[i++] = ch;

             do {

                    ch = fgetc(PGM);

                    str[i++] = ch;

             } while(ch >= '0' && ch <= '9');

             str[i-1] = 0;

             value[j] = atoi(str);

             i=0;

       }

       width = value[0];

       height = value[1];

       maxval = value[2];

       pixel = (char *)malloc (height*width);

       M=width;

       if (pixel == NULL) {

             printf("MALLOC ERROR");

             return 0;

       }

/*Program Consol ile baslandiysa buradan kontrol ediyoruz*/

       if(argc!=4&&argc!=1){

             printf("hatali veri girisi, komut ile birlikte 3 veri giriniz /N-sigma-thr");

             return 0;

       }

/*Gerekli verileri kullanicidan istiyoruz*/

       else if(argc==1){

             printf ("Exp[NxN] kare matrisinin boyutlarini giriniz:\n");

             scanf ("%d",&N);

             printf ("Sigma degerini giriniz:\n");

             scanf ("%lf",&sigma);

             printf("\nThreshold degerini giriniz: \n");

             scanf("%lf",&thr);}

       else if(argc==4){

             N=atoi(argv[1]);

             sigma=atof(argv[2]);

             thr=atof(argv[3]);

       }

/*Simdi eldeki verileri kullanarak görüntüyü isleme islemine geçiyoruz*/

       Mx=N/2+1;

       My=N/2+1;

       pgm_degerler=(int *)malloc((M*M)*sizeof(int));

       A=(double**)malloc(M*sizeof(double));

       for(a=0; a<M; a++)

             A[a] =(double *) malloc( M * sizeof(double));

       B=(double**)malloc(N*sizeof(double));

       for(a=0; a<N; a++)

             B[a] =(double *) malloc( N * sizeof(double));

       C=(double**)malloc((M-N+1)*sizeof(double));

       for(a=0; a<(M-N+1); a++)

             C[a] =(double *) malloc( (M-N+1) * sizeof(double));

       Ix=(double**)malloc((M-N-1)*sizeof(double));

       for(a=0; a<(M-N-1); a++)

             Ix[a] =(double *) malloc( (M-N-1) * sizeof(double));

       Iy=(double**)malloc((M-N-1)*sizeof(double));

       for(a=0; a<(M-N-1); a++)

             Iy[a] =(double *) malloc( (M-N-1) * sizeof(double));

       Ixx=(double**)malloc((M-N-1)*sizeof(double));

       for(a=0; a<(M-N-1); a++)

             Ixx[a] =(double *) malloc( (M-N-1) * sizeof(double));

       Ixy=(double**)malloc((M-N-1)*sizeof(double));

       for(a=0; a<(M-N-1); a++)

             Ixy[a] =(double *) malloc( (M-N-1) * sizeof(double));

       Iyy=(double**)malloc((M-N-1)*sizeof(double));

       for(a=0; a<(M-N-1); a++)

             Iyy[a] =(double *) malloc( (M-N-1) * sizeof(double));

       Sxx=(double**)malloc((M-2*N)*sizeof(double));

       for(a=0; a<(M-2*N); a++)

             Sxx[a] =(double *) malloc( (M-2*N) * sizeof(double));

       Sxy=(double**)malloc((M-2*N)*sizeof(double));

       for(a=0; a<(M-2*N); a++)

             Sxy[a] =(double *) malloc( (M-2*N) * sizeof(double));

       Syy=(double**)malloc((M-2*N)*sizeof(double));

       for(a=0; a<(M-2*N); a++)

             Syy[a] =(double *) malloc( (M-2*N) * sizeof(double));

       R=(double**)malloc((M-2*N-1)*sizeof(double));

       for(a=0; a<(M-2*N-1); a++)

             R[a] =(double *) malloc( (M-2*N-1) * sizeof(double));

       for (j=0; j<(M*M); j++) {

             i=0;

             do{ch = fgetc(PGM);}while(!(ch >= '0' && ch <= '9'));

             for(i=0;(ch >= '0' && ch <= '9');i++)

             {

                    str[i] = ch;

                    ch = fgetc(PGM);

             }

             for(;i<7;i++)

                    str[i] = ' ';

             pgm_degerler[j] = atoi(str);

             i=0;

       }

       for (x=0;x<M;x++)

             for (y=0;y<M;y++)

                    A[x][y]=pgm_degerler[(x*M)+y];

       exp_atama(B,N,sigma,Mx,My);

       convolution (A, B, C, M, N);

       turev (Ix,Iy,C,M-N+1);

       kare (Ix,Ix,Ixx,M-N-1);

       kare (Ix,Iy,Ixy,M-N-1);

       kare (Iy,Iy,Iyy,M-N-1);

       convolution (Ixx, B, Sxx, M-N-1, N);

       convolution (Ixy, B, Sxy, M-N-1, N);

       convolution (Iyy, B, Syy, M-N-1, N);

/*Malloc lar ile açtigimiz yerlerle artik isimiz kalmadigi için oralari hafizadan bosaltiyoruz*/

       free(B);

       free(C);

       free(Ix);

       free(Iy);

       free(Ixx);

       free(Ixy);

       free(Iyy);

       for(a=0;a<(M-2*N-1);a++)

             for(b=0;b<(M-2*N-1);b++)

                    R[a][b]=abs((int)Sxx[a][b]*Syy[a][b]-pow(Sxy[a][b],2))+(k*pow((Sxx[a][b]+Syy[a][b]),2));

/*Yeni olusacak resim dosyasinin yolunu belirtiyoruz*/

       PGMx=fopen("D:\\resimyeni.pgm","wb");

       fprintf(PGMx,"%c%c%d %d %d ",c1,c2,width,height,maxval);

       for(a=0;a<(M-2*N-1);a++){

             for(b=0;b<(M-2*N-1);b++){

                    if(R[a][b]<thr)

                           R[a][b]=0;

                    else

                    {

                           R[a][b]=1;

                           for(i=a+N-6;i<a+N+7;i++)

                                  for(j=b+N-6;j<b+N+7;j++)

                                        if((i==a+N-6||i==a+N+6||j==b+N-6||j==b+N+6)&&(i>=0&&i<M)&&(j>=0&&j<M))

                                               A[i][j]=255;

                    }

             }}

       for (x=0;x<M;x++)

             for (y=0;y<M;y++)

                    fprintf(PGMx,"%3.0lf ",A[x][y]);

       fclose(PGMx);

/*Malloc lar ile açtigimiz yerlerle artik isimiz kalmadigi için oralari hafizadan bosaltiyoruz*/

       free(Sxx);

       free(Sxy);

       free(Syy);

       free(A);

       free(R);

       fclose(PGM);

}

/*Exponansiyel sayi atamasi yapiyoruz*/

void exp_atama(double **r,int j,double sigma,int Mx,int My){

       int x,y;

       double toplam=0,ass,aas;

       for (x=0;x<j;x++)

             for (y=0;y<j;y++){

                    ass=x-Mx+1;

                    aas=y-My+1;

                    r[x][y]=exp((-1)*((pow(ass,2)+pow(aas,2))/2*pow(sigma,2)));

                    toplam+=r[x][y];}

             for (x=0;x<j;x++)

                    for (y=0;y<j;y++)

                           r[x][y]/=toplam;

}

void convolution (double **A, double **B, double **C, int M, int N){

       int x,y,a,b,f,k;

       double toplam=0;

       for (x=(N/2);x<(M-N/2);x++)

             for (y=(N/2);y<(M-N/2);y++){

                    for (a=(-1)*(N/2),toplam=0;a<=N/2;a++){

                           for (b=(-1)*(N/2);b<=N/2;b++){

                                  f=a+x;

                                  k=b+y;

                                  toplam+=A[f][k]*B[a+N/2][b+N/2];}}

                    C[x-(N/2)][y-(N/2)]=(double)toplam;}

}

void turev (double **Ik,double **Il,double **C,int i){

       int a,b;

       for(a=0;a<(i-2);a++)

             for(b=0;b<(i-2);b++){

                    Ik[a][b]=C[a][b]-2*C[a][b+1]+C[a][b+2];

                    Il[a][b]=C[b][a]-2*C[b+1][a]+C[b+2][a];}

}

void kare (double **Ia,double **Ib,double **Iz,int i){

       int a,b;

       for(a=0;a<i;a++)

             for(b=0;b<i;b++)

                    Iz[a][b]=Ia[a][b]*Ib[a][b];

}

Ve islemimizi tamamliyoruz. Belirttigimiz dosya girdigimiz hassasiyet ölçülerine göre tarandi ve belirtilen hassasiyete uygun olarak köseler belirlenip kare içerisine alindi. 




Diğer Yazılarımdan Seçmeler...