My goal is to blur an image in C (not C++), by taking the average of all surrounding pixels. I have separated my calculations by:
- If pixel is at the top left corner
- If pixel is at top right corner
- If pixel is at bottom left center
- If pixel is at bottom right corner
- If pixel is at top edge (no corner)
- If pixel is at bottom edge (no corner)
- All other pixels
I am having a lot of trouble with my code, which I fixed by creating a copy of the image. But, the my code starts to not work when it gets to the bottom few rows in a 3x3 and 4x4 image.
I need help with reviewing what is wrong with my code. Also, I know my code is very lengthy which is a way for me to write everything out and understand it more, but I would also like if someone could give input on another way to write the code. I am very new to this, so I definitely need a lot of explanation. I have searched and viewed other shortened, well written codes, but I have a hard time understanding it.
I'd really appreciate all the help!
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width]){
//top left corner variables
float ravg_lcorner = 0;
float gavg_lcorner = 0;
float bavg_lcorner = 0;
//top right corner variables
float ravg_rcorner = 0;
float gavg_rcorner = 0;
float bavg_rcorner = 0;
//bottom left corner variables
float ravg_blcorner = 0;
float gavg_blcorner = 0;
float bavg_blcorner = 0;
//bottom right corner variables
float ravg_brcorner = 0;
float gavg_brcorner = 0;
float bavg_brcorner = 0;
//top row center variables
float ravg_topcenter = 0;
float gavg_topcenter = 0;
float bavg_topcenter = 0;
//top row center variables
float ravg_btmcenter = 0;
float gavg_btmcenter = 0;
float bavg_btmcenter = 0;
//left side center variables
float ravg_lscenter = 0;
float gavg_lscenter = 0;
float bavg_lscenter = 0;
//right side center variables
float ravg_rscenter = 0;
float gavg_rscenter = 0;
float bavg_rscenter = 0;
//center variaables
float ravg_center = 0;
float gavg_center = 0;
float bavg_center = 0;
RGBTRIPLE temp;
RGBTRIPLE copy_image[height][width];
//create copy of image canvas
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp = image[i][j];
image[i][j] = copy_image[i][j];
copy_image[i][j] = temp;
}
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
//if pixel is at top row left corner
if (i == 0 && j == 0)
{
//calculate all red average
ravg_lcorner = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j+1].rgbtRed + copy_image[i+1][j].rgbtRed + copy_image[i+1][j+1].rgbtRed) / 4.00);
//calculate all green average
gavg_lcorner = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j+1].rgbtGreen + copy_image[i+1][j].rgbtGreen + copy_image[i+1][j+1].rgbtGreen) / 4.00);
//calculate all blue average
bavg_lcorner = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j+1].rgbtBlue + copy_image[i+1][j].rgbtBlue + copy_image[i+1][j+1].rgbtBlue) / 4.00);
//new pixel color
image[i][j].rgbtRed = ravg_lcorner;
image[i][j].rgbtGreen = gavg_lcorner;
image[i][j].rgbtBlue = bavg_lcorner;
}
//if pixel is top row right corner
if (i == 0 && j == width - 1)
{
//calculate all red average
ravg_rcorner = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j-1].rgbtRed + copy_image[i+1][j].rgbtRed + copy_image[i+1][j-1].rgbtRed) / 4.00);
//calculate all green average
gavg_rcorner = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j-1].rgbtGreen + copy_image[i+1][j].rgbtGreen + copy_image[i+1][j-1].rgbtGreen) / 4.00);
//calculate all blue average
bavg_rcorner = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j-1].rgbtBlue + copy_image[i+1][j].rgbtBlue + copy_image[i+1][j-1].rgbtBlue) / 4.00);
//new pixel color
image[i][j].rgbtRed = ravg_rcorner;
image[i][j].rgbtGreen = gavg_rcorner;
image[i][j].rgbtBlue = bavg_rcorner;
}
//if pixel is at bottom row left corner
if(i == height - 1 && j == 0)
{
//calculate all red average
ravg_blcorner = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j+1].rgbtRed + copy_image[i-1][j].rgbtRed + copy_image[i-1][j+1].rgbtRed) / 4.00);
//calculate all green average
gavg_blcorner = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j+1].rgbtGreen + copy_image[i-1][j].rgbtGreen + copy_image[i-1][j+1].rgbtGreen) / 4.00);
//calculate all blue average
bavg_blcorner = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j+1].rgbtBlue + copy_image[i-1][j].rgbtBlue + copy_image[i-1][j+1].rgbtBlue) / 4.00);
//new pixel color
copy_image[i][j].rgbtRed = ravg_blcorner;
copy_image[i][j].rgbtGreen = gavg_blcorner;
copy_image[i][j].rgbtBlue = bavg_blcorner;
}
//if pixel is at bottom row right corner
if(i == height -1 && j == width - 1)
{
//calculate all red average
ravg_brcorner = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j-1].rgbtRed + copy_image[i-1][j].rgbtRed + copy_image[i-1][j-1].rgbtRed) / 4.00);
//calculate all green average
gavg_brcorner = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j-1].rgbtGreen + copy_image[i-1][j].rgbtGreen + copy_image[i-1][j-1].rgbtGreen) / 4.00);
//calculate all blue average
bavg_brcorner = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j-1].rgbtBlue + copy_image[i-1][j].rgbtBlue + copy_image[i-1][j-1].rgbtBlue) / 4.00);
//new pixel color
image[i][j].rgbtRed = ravg_rcorner;
image[i][j].rgbtGreen = gavg_rcorner;
image[i][j].rgbtBlue = bavg_rcorner;
}
//if pixel is top row center
if(i == 0 && j < width - 1 && j > 0)
{
//calculate all red average
ravg_topcenter = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j-1].rgbtRed + copy_image[i][j+1].rgbtRed + copy_image[i+1][j-1].rgbtRed + copy_image[i+1][j].rgbtRed + copy_image[i+1][j+1].rgbtRed) / 6.00);
//calculate all green average
gavg_topcenter = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j-1].rgbtGreen + copy_image[i][j+1].rgbtGreen + copy_image[i+1][j-1].rgbtGreen + copy_image[i+1][j].rgbtGreen + copy_image[i+1][j+1].rgbtGreen) / 6.00);
//calculate all blue average
bavg_topcenter = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j-1].rgbtBlue + copy_image[i][j+1].rgbtBlue + copy_image[i+1][j-1].rgbtBlue + copy_image[i+1][j].rgbtBlue + copy_image[i+1][j+1].rgbtBlue) / 6.00);
//new pixel color
image[i][j].rgbtRed = ravg_topcenter;
image[i][j].rgbtGreen = gavg_topcenter;
image[i][j].rgbtBlue = bavg_topcenter;
}
//if pixel is bottom row center
if(i == height - 1 && j < width - 1 && j > 0)
{
//calculate all red average
ravg_topcenter = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j-1].rgbtRed + copy_image[i][j+1].rgbtRed + copy_image[i-1][j-1].rgbtRed + copy_image[i-1][j].rgbtRed + copy_image[i-1][j+1].rgbtRed) / 6.00);
//calculate all green average
gavg_topcenter = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j-1].rgbtGreen + copy_image[i][j+1].rgbtGreen + copy_image[i-1][j-1].rgbtGreen + copy_image[i-1][j].rgbtGreen + copy_image[i-1][j+1].rgbtGreen) / 6.00);
//calculate all blue average
bavg_topcenter = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j-1].rgbtBlue + copy_image[i][j+1].rgbtBlue + copy_image[i-1][j-1].rgbtBlue + copy_image[i-1][j].rgbtBlue + copy_image[i-1][j+1].rgbtBlue) / 6.00);
//new pixel color
image[i][j].rgbtRed = ravg_btmcenter;
image[i][j].rgbtGreen = gavg_btmcenter;
image[i][j].rgbtBlue = bavg_btmcenter;
}
//if pixel is at left side center
if (i < height - 1 && i > 0 && j == 0)
{
//calculate all red average
ravg_lscenter = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j+1].rgbtRed + copy_image[i-1][j].rgbtRed + copy_image[i-1][j+1].rgbtRed + copy_image[i+1][j].rgbtRed + copy_image[i+1][j+1].rgbtRed) / 6.00);
//calculate all green average
gavg_lscenter = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j+1].rgbtGreen + copy_image[i-1][j].rgbtGreen + copy_image[i-1][j+1].rgbtGreen + copy_image[i+1][j].rgbtGreen + copy_image[i+1][j+1].rgbtGreen) / 6.00);
//calculate all blue average
bavg_lscenter = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j+1].rgbtBlue + copy_image[i-1][j].rgbtBlue + copy_image[i-1][j+1].rgbtBlue + copy_image[i+1][j].rgbtBlue + copy_image[i+1][j+1].rgbtBlue) / 6.00);
//new pixel color
image[i][j].rgbtRed = ravg_lscenter;
image[i][j].rgbtGreen = gavg_lscenter;
image[i][j].rgbtBlue = bavg_lscenter;
}
//if pixel is at right side center
if (i < height - 1 && i > 0 && j == width - 1)
{
//calculate all red average
ravg_rscenter = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j-1].rgbtRed + copy_image[i-1][j].rgbtRed + copy_image[i-1][j-1].rgbtRed + copy_image[i+1][j].rgbtRed + copy_image[i+1][j-1].rgbtRed) / 6.00);
//calculate all green average
gavg_rscenter = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j-1].rgbtGreen + copy_image[i-1][j].rgbtGreen + copy_image[i-1][j-1].rgbtGreen + copy_image[i+1][j].rgbtGreen + copy_image[i+1][j-1].rgbtGreen) / 6.00);
//calculate all blue average
bavg_rscenter = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j-1].rgbtBlue + copy_image[i-1][j].rgbtBlue + copy_image[i-1][j-1].rgbtBlue + copy_image[i+1][j].rgbtBlue + copy_image[i+1][j-1].rgbtBlue) / 6.00);
//new pixel color
image[i][j].rgbtRed = ravg_rscenter;
image[i][j].rgbtGreen = gavg_rscenter;
image[i][j].rgbtBlue = bavg_rscenter;
}
//if pixel is at center
if (i < height - 1 && i > 0 && j < width - 1 && j > 0)
{
//calculate all red average
ravg_center = (int) round((copy_image[i][j].rgbtRed + copy_image[i][j-1].rgbtRed + copy_image[i][j+1].rgbtRed + copy_image[i+1][j+1].rgbtRed + copy_image[i+1][j].rgbtRed + copy_image[i+1][j-1].rgbtRed + copy_image[i-1][j-1].rgbtRed + copy_image[i-1][j].rgbtRed + copy_image[i-1][j+1].rgbtRed) / 9.00);
//calculate all green average
gavg_center = (int) round((copy_image[i][j].rgbtGreen + copy_image[i][j-1].rgbtGreen + copy_image[i][j+1].rgbtGreen + copy_image[i+1][j+1].rgbtGreen + copy_image[i+1][j].rgbtGreen + copy_image[i+1][j-1].rgbtGreen + copy_image[i-1][j-1].rgbtGreen + copy_image[i-1][j].rgbtGreen + copy_image[i-1][j+1].rgbtGreen) / 9.00);
//calculate all blue average
bavg_center = (int) round((copy_image[i][j].rgbtBlue + copy_image[i][j-1].rgbtBlue + copy_image[i][j+1].rgbtBlue + copy_image[i+1][j+1].rgbtBlue + copy_image[i+1][j].rgbtBlue + copy_image[i+1][j-1].rgbtBlue + copy_image[i-1][j-1].rgbtBlue + copy_image[i-1][j].rgbtBlue + copy_image[i-1][j+1].rgbtBlue) / 9.00);
//new pixel color
image[i][j].rgbtRed = ravg_center;
image[i][j].rgbtGreen = gavg_center;
image[i][j].rgbtBlue = bavg_center;
}
}
}
return;}