Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

Labsheet-4

P Vijayasree
September 23, 2013

Program code

1 Image convolution
a)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct image
{
unsigned char *headr,**dat;
int w;
int h;
int d;
}IMAGE;
IMAGE *image_conv(IMAGE *image_name);
IMAGE *image_read(char *filename);
void image_write(char *filename,IMAGE *image_name);
int main(int argc, char* argv[])
{
IMAGE *image1=image_read("lena.bmp");
IMAGE *image2=image_conv(image1);
image_write("new1.bmp",image2);
return 0;
}
IMAGE *image_conv(IMAGE *image_name)
{
unsigned char **data,**z;
float **img;
int i=0,j=0,k=0,l=0;
float temp=0.0;
int temp1=0;
//image_name=(IMAGE *)malloc(sizeof(IMAGE));
//averaging kernel
float mat[3][3]={
1.0/9.0,1.0/9.0,1.0/9.0,
1.0/9.0,1.0/9.0,1.0/9.0,
1.0/9.0,1.0/9.0,1.0/9.0
};
/*//Brightness control kernel
float mat[3][3]={
0,0,0,
0,4,0,
1

0,0,0
};
*/
data = malloc((image_name->w) * sizeof(unsigned char *));
for(i = 0; i < image_name->w; i++)
data[i] = malloc((image_name->h) * sizeof(unsigned char));
z = malloc((image_name->w) * sizeof(unsigned char *));
for(i = 0; i < image_name->w; i++)
z[i] = malloc((image_name->h) * sizeof(unsigned char));
img = malloc(image_name->w * sizeof(float *));
for(i = 0; i < image_name->w; i++)
img[i] = malloc(image_name->h * sizeof(float));
for(i=0;i<image_name->w;i++)
for(j=0;j<image_name->h;j++)
img[i][j]=0.0;
for(i=0;i<image_name->w;i++)
for(j=0;j<image_name->h;j++)
data[i][j]=image_name->dat[i][j];

for(i=0;i<image_name->w;i++)
for(j=0;j<image_name->h;j++)
img[i][j] = (float ) data[i][j];
for(i=1;i<(image_name->w-1);i++)
{
for(j=1;j<(image_name->h-1);j++)
{
temp=0.0;
for(k=-1;k<2;k++)
{
for(l=-1;l<2;l++)
{
temp += mat[k+1][l+1] * img[i-k][j-l] ;
}
}
if(temp>255)
{
temp = 255;
}
z[i][j] = (unsigned char) temp;
}
}
image_name->dat=z;
return image_name;
}

void image_write(char *filename,IMAGE *image_name)


{
FILE *op;
int i,j;

op=fopen(filename,"wb");
fseek(op,0L,SEEK_SET);
fwrite(image_name->headr,1,1078,op);
fseek(op,1078L,SEEK_SET);
for(i=0;i<image_name->h;i++)
for(j=0;j<image_name->w;j++)
fprintf(op,"%c",image_name->dat[i][j]);
fclose(op);
}
IMAGE *image_read(char *filename)
{
int width,height,depth,k,i,j;
unsigned char *header,dummy[4];
unsigned char **data;
FILE *ip;
IMAGE *ptr,im;
ptr=&im;
ip=fopen(filename,"rb");
header=(unsigned char *) malloc(1078);
fseek(ip,0L,SEEK_SET);
fread(header,1,1078,ip);
for(k=0;k<4;k++)
dummy[k]=header[k+18];
int *wp,*hp,*dp;
wp=(int*)dummy;
width=*wp;
for(k=0;k<4;k++)
dummy[k]=header[k+22];
hp=(int*)dummy;
height=*hp;
for(k=0;k<2;k++)
dummy[k]=header[k+28];
dp=(int*)dummy;
depth=*dp/8;
data = malloc(width * sizeof(unsigned char *));
for(i = 0; i < width; i++)
data[i] = malloc(height * sizeof(unsigned char));
fseek(ip,1078L,SEEK_SET);
for(i=0;i<height;i++)
for(j=0;j<width;j++)
fscanf(ip,"%c",&data[i][j]);
ptr=(IMAGE *)malloc(sizeof(IMAGE));
ptr->h=height;
ptr->w=width;
ptr->d=depth;
ptr->headr=header;
ptr->dat=data;
return ptr;
}

2
2.1

results
Original Image

Figure 1: Input image

2.2

Averaging Kernel

1.0/9.0,1.0/9.0,1.0/9.0,
1.0/9.0,1.0/9.0,1.0/9.0,
1.0/9.0,1.0/9.0,1.0/9.0

2.3

Averaged output Image

Figure 2: Averaged output Image

2.4

Kernel-2

0 -1 0
-1 4 -1
0 -1 0

2.5

Output Image

Figure 3: Averaged output Image

You might also like