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>
/*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.