Logic Used:
Insert Pixel Data into a struct containing RGB values of the pixels
read Data in a 3x3 array: | BGR(-1,-1) | BGR(-1,0) | BGR(-1,1) |
| BGR(0,-1) | BGR(0,0) | BGR(0,1) |
| BGR(1,-1) | BGR(1,0) | BGR(1,1) |
Assign Average of all Blue,Green,Red components respectively to another struct containing RGB values and write the same
to the output file

Problem:Unexpected output,as seen in the bmp files attached in mail.The output image is supposed to be almost the same,except a little blurred.

Input File: o.bmp
Output File: q.bmp

``````#define MASKSIZE 3
#define INFILE "o.bmp"
#define OUTFILE "q.bmp"

fp1=fopen(INFILE,"rb");
fp3=fopen(OUTFILE2,"wb");

fseek(fp1,bmfh.bfOffsetBits,SEEK_SET);     /*Set Position to Start of Pixel Data*/

row=0;      /*Offset for Row of Bitmap Array*/
/*Begin Loop*/
while(row<bmih.biHeight)
{
col=0;         /*Offset for Column of Bitmap Array*/
while(col<bmih.biWidth)
{
fseek(fp1,(bmfh.bfOffsetBits)+(row * (bmih.biWidth * 3))+(col),SEEK_SET);  /*Move to Next Pixel (central pixel on which mask coincides)*/

pos=ftell(fp1);
if(row==0)
{
if(col==0)
{
fseek(fp1,0,SEEK_CUR);      /*for poition (0,0) read pixel from (0,0)*/
}
else
{
fseek(fp1,ftell(fp1)-3,SEEK_CUR);  /*for position(0,col) read pixel into array from previous pixel( - 3Bytes)*/
}
}
else
{
if(col==0)
{
fseek(fp1,ftell(fp1)-(bmih.biWidth *3),SEEK_CUR);  /*for position(row,0) start reading into array from the pixel directly above current position*/
}
else
{
if(col == (bmih.biWidth)-1)
{
fseek(fp1,ftell(fp1)-((bmih.biWidth+1)*3),SEEK_CUR); /*for poition(row,Width-1) read pixel data into array at position (-1,-1) in a 3x3 array*/
}
else
{
fseek(fp1,ftell(fp1)-((bmih.biWidth+1)*3),SEEK_CUR); /*for position(row,col)*/
}
}
}
/*Begin Reading Pixel Data Into Array */
for(rowoff=-1;rowoff<2;rowoff++)
{
for(coloff=-1;coloff<2;coloff++)
{
{
rgb[-1][-1].rgbtBlue=rgb[-1][0].rgbtBlue=rgb[-1][2].rgbtBlue=0;
rgb[-1][-1].rgbtGreen=rgb[-1][0].rgbtGreen=rgb[-1][2].rgbtGreen=0;
rgb[-1][-1].rgbtRed=rgb[-1][0].rgbtRed=rgb[-1][2].rgbtRed=0;
rowoff++;
}
{
rgb[-1][-1].rgbtBlue=rgb[0][-1].rgbtBlue=rgb[1][-1].rgbtBlue=0;
rgb[-1][-1].rgbtGreen=rgb[0][-1].rgbtGreen=rgb[1][-1].rgbtGreen=0;
rgb[-1][-1].rgbtRed=rgb[0][-1].rgbtRed=rgb[1][-1].rgbtRed=0;
coloff++;
}
rgb[rowoff][coloff].rgbtBlue=pixel->rgbtBlue;
rgb[rowoff][coloff].rgbtGreen=pixel->rgbtGreen;
rgb[rowoff][coloff].rgbtRed=pixel->rgbtRed;
{
rgb[-1][1].rgbtBlue=rgb[0][1].rgbtBlue=rgb[1][1].rgbtBlue=0;
rgb[-1][1].rgbtGreen=rgb[0][1].rgbtGreen=rgb[1][1].rgbtGreen=0;
rgb[-1][1].rgbtRed=rgb[0][1].rgbtRed=rgb[1][1].rgbtRed=0;
coloff++;
}
{
rgb[1][-1].rgbtBlue=rgb[1][0].rgbtBlue=rgb[1][1].rgbtBlue=0;
rgb[1][-1].rgbtGreen=rgb[1][0].rgbtGreen=rgb[1][1].rgbtGreen=0;
rgb[1][-1].rgbtRed=rgb[1][0].rgbtRed=rgb[1][1].rgbtRed=0;
rowoff++;
}
}
}
/*Begin Averaging Array color value*/
for(i=-1;i<2;i++)
{
for(j=-1;j<2;j++)
{
Blue=(Blue+(rgb[i][j].rgbtBlue))/9;
Green=(Green+(rgb[i][j].rgbtGreen))/9;
Red=(Red+(rgb[i][j].rgbtRed))/9;
}
}
/*Averaging Finish*/
/*Write Averaged Values Into Fil*/
pixel->rgbtBlue=Blue;
pixel->rgbtGreen=Green;
pixel->rgbtRed=Red;
fwrite(pixel,1,sizeof(RGBTRIPLE),fp3);
/*Finish Writing*/
col++;
}
row++;
}
/*End Loop*/``````

Input Image:
[IMG]http://www.daniweb.com/forums/attachment.php?attachmentid=12733&stc=1&d=1259307546[/IMG]

Output Image:
[IMG]http://www.daniweb.com/forums/attachment.php?attachmentid=12734&stc=1&d=1259307546[/IMG]

I would really appreciate it and be extremely grateful if someone could help me out with this problem.....or at least redirect me to some place where i can find an answer.I have been trying to solve this problem for at least a week now.
Or if someone could help me with a better way to implement an averaging filters algorithm.....Please

I would suggest creating at least one function, getPixel, to make your code more readable. Post this new code and i'll try to take a look.