I am working on a CS50 problem set in which I need to do a box blur for each pixel of an image. Though my code is a bit redundant, as I had created many if loop for special cases of pixels (like edges and corners), it blurs the image as expected, so I'm not really sure how to fix the problem.
There's also a more detailed error code here (only look at the "blur" errors)
I think make this error because the value can't save like that(but I printed and unhide on my screen)
//assign new values of surrounding pixels to that pixel.
image[i][j].rgbtBlue = averageBlue;
image[i][j].rgbtGreen = averageGreen;
image[i][j].rgbtRed = averageRed;
Here's my code below:
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++) { // Run vertically the image
for (int j = 0; j < width; j++) { // Run horizontally the image
int iplus = i + 1; // pixel kế tiếp theo hàng dọc
int jplus = j + 1; // pixel kế tiếp theo hàng ngang
int iminus = i - 1; // trước đó theo hàng dọc
int jminus = j - 1; // trước đó theo hàng ngang
//make red pointer, green pointer and blue pointer of array to save value pixel
int *ninepred;
int *ninepgreen;
int *ninepblue;
//By default, around a pixel is 8 pixels with count = 9(8 pixel around and it's self)
int count = 9;
//Used to calculate the sum of the elements in the three arrays ninepred, ninegreen and nineblue
int totalRed = 0;
int totalGreen = 0;
int totalBlue = 0;
// kiem tra 4 o o 4 goc
if ((i == 0 && j == 0) || (i = 0 && j == width - 1) ||
(i == height - 1 && j == 0) || (i == height - 1 && j == width - 1)) {
count = 4; //include 3 pixels around and itself
// make space memory by malloc for pointer.
ninepred = (int*)malloc(count * sizeof(int));
ninepgreen = (int*)malloc(count * sizeof(int));
ninepblue = (int*)malloc(count * sizeof(int));
if (i == 0 && j == 0) {
// add red RMB
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jplus].rgbtRed;
ninepred[2] = image[iplus][j].rgbtRed;
ninepred[3] = image[iplus][jplus].rgbtRed;
// add green RMB
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jplus].rgbtGreen;
ninepgreen[2] = image[iplus][j].rgbtGreen;
ninepgreen[3] = image[iplus][jplus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jplus].rgbtBlue;
ninepblue[2] = image[iplus][j].rgbtBlue;
ninepblue[3] = image[iplus][jplus].rgbtBlue;
}
else if (i == 0 && j == width - 1) {
// add red RMB
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jminus].rgbtRed;
ninepred[2] = image[iplus][j].rgbtRed;
ninepred[3] = image[iplus][jminus].rgbtRed;
// add green RMB
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jminus].rgbtGreen;
ninepgreen[2] = image[iplus][j].rgbtGreen;
ninepgreen[3] = image[iplus][jminus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jminus].rgbtBlue;
ninepblue[2] = image[iplus][j].rgbtBlue;
ninepblue[3] = image[iplus][jminus].rgbtBlue;
}
else if (i == height - 1 && j == 0) {
// add red RMB
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jplus].rgbtRed;
ninepred[2] = image[iminus][j].rgbtRed;
ninepred[3] = image[iminus][jplus].rgbtRed;
// add green RMB
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jplus].rgbtGreen;
ninepgreen[2] = image[iminus][j].rgbtGreen;
ninepgreen[3] = image[iminus][jplus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jplus].rgbtBlue;
ninepblue[2] = image[iminus][j].rgbtBlue;
ninepblue[3] = image[iminus][jplus].rgbtBlue;
} else {
// add red RMB
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jminus].rgbtRed;
ninepred[2] = image[iminus][j].rgbtRed;
ninepred[3] = image[iminus][jminus].rgbtRed;
// add green RMB
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jminus].rgbtGreen;
ninepgreen[2] = image[iminus][j].rgbtGreen;
ninepgreen[3] = image[iminus][jminus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jminus].rgbtBlue;
ninepblue[2] = image[iminus][j].rgbtBlue;
ninepblue[3] = image[iminus][jminus].rgbtBlue;
};
}
else if (i == 0) {
count = 6;//include 5 pixels around and itself
// make space memory by malloc for pointer.
ninepred = (int*)malloc(count * sizeof(int));
ninepgreen = (int*)malloc(count * sizeof(int));
ninepblue = (int*)malloc(count * sizeof(int));
//insert 3 value 0 as to 9P array
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jplus].rgbtRed;
ninepred[2] = image[i][jminus].rgbtRed;
ninepred[3] = image[iplus][j].rgbtRed;
ninepred[4] = image[iplus][jplus].rgbtRed;
ninepred[5] = image[iplus][jminus].rgbtRed;
//insert green pixel
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jplus].rgbtGreen;
ninepgreen[2] = image[i][jminus].rgbtGreen;
ninepgreen[3] = image[iplus][j].rgbtGreen;
ninepgreen[4] = image[iplus][jplus].rgbtGreen;
ninepgreen[5] = image[iplus][jminus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jplus].rgbtBlue;
ninepblue[2] = image[i][jminus].rgbtBlue;
ninepblue[3] = image[iplus][j].rgbtBlue;
ninepblue[4] = image[iplus][jplus].rgbtBlue;
ninepblue[5] = image[iplus][jminus].rgbtBlue;
}
//check the finally row
else if (i == height -1) {
count = 6;//include 5 pixels around and itself
// make space memory by malloc for pointer.
ninepred = (int*)malloc(count * sizeof(int));
ninepgreen = (int*)malloc(count * sizeof(int));
ninepblue = (int*)malloc(count * sizeof(int));
//insert 3 value 0 as to 9P array
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jplus].rgbtRed;
ninepred[2] = image[i][jminus].rgbtRed;
ninepred[3] = image[iminus][j].rgbtRed;
ninepred[4] = image[iminus][jplus].rgbtRed;
ninepred[5] = image[iminus][jminus].rgbtRed;
//insert green pixel
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jplus].rgbtGreen;
ninepgreen[2] = image[i][jminus].rgbtGreen;
ninepgreen[3] = image[iplus][j].rgbtGreen;
ninepgreen[4] = image[iplus][jplus].rgbtGreen;
ninepgreen[5] = image[iplus][jminus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jplus].rgbtBlue;
ninepblue[2] = image[i][jminus].rgbtBlue;
ninepblue[3] = image[iminus][j].rgbtBlue;
ninepblue[4] = image[iminus][jplus].rgbtBlue;
ninepblue[5] = image[iminus][jminus].rgbtBlue;
}
//check the first column
else if (j == 0) {
count = 6;//include 5 pixels around and itself
// make space memory by malloc for pointer.
ninepred = (int*)malloc(count * sizeof(int));
ninepgreen = (int*)malloc(count * sizeof(int));
ninepblue = (int*)malloc(count * sizeof(int));
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jplus].rgbtRed;
ninepred[2] = image[iplus][j].rgbtRed;
ninepred[3] = image[iplus][jplus].rgbtRed;
ninepred[4] = image[iminus][j].rgbtRed;
ninepred[5] = image[iminus][jplus].rgbtRed;
//insert green pixel
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jplus].rgbtGreen;
ninepgreen[2] = image[iplus][j].rgbtGreen;
ninepgreen[3] = image[iplus][jplus].rgbtGreen;
ninepgreen[4] = image[iminus][j].rgbtGreen;
ninepgreen[5] = image[iminus][jplus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jplus].rgbtBlue;
ninepblue[2] = image[iplus][j].rgbtBlue;
ninepblue[3] = image[iplus][jplus].rgbtBlue;
ninepblue[4] = image[iminus][j].rgbtBlue;
ninepblue[5] = image[iminus][jplus].rgbtBlue;
}
//check the finally column
else if (j == width - 1) {
count = 6;//include 5 pixels around and itself
// make space memory by malloc for pointer.
ninepred = (int*)malloc(count * sizeof(int));
ninepgreen = (int*)malloc(count * sizeof(int));
ninepblue = (int*)malloc(count * sizeof(int));
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jminus].rgbtRed;
ninepred[2] = image[iplus][j].rgbtRed;
ninepred[3] = image[iplus][jminus].rgbtRed;
ninepred[4] = image[iminus][j].rgbtRed;
ninepred[5] = image[iminus][jminus].rgbtRed;
//insert green pixel
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jminus].rgbtGreen;
ninepgreen[2] = image[iplus][j].rgbtGreen;
ninepgreen[3] = image[iplus][jminus].rgbtGreen;
ninepgreen[4] = image[iminus][j].rgbtGreen;
ninepgreen[5] = image[iminus][jminus].rgbtGreen;
// add glue RMB
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jminus].rgbtBlue;
ninepblue[2] = image[iplus][j].rgbtBlue;
ninepblue[3] = image[iplus][jminus].rgbtBlue;
ninepblue[4] = image[iminus][j].rgbtBlue;
ninepblue[5] = image[iminus][jminus].rgbtBlue;
}
else {
//insert red pixel
// make space memory by malloc for pointer.
ninepred = (int*)malloc(count * sizeof(int));
ninepgreen = (int*)malloc(count * sizeof(int));
ninepblue = (int*)malloc(count * sizeof(int));
ninepred[0] = image[i][j].rgbtRed;
ninepred[1] = image[i][jplus].rgbtRed;
ninepred[2] = image[i][jminus].rgbtRed;
ninepred[3] = image[iminus][j].rgbtRed;
ninepred[4] = image[iminus][j].rgbtRed;
ninepred[5] = image[iminus][jminus].rgbtRed;
ninepred[6] = image[iplus][j].rgbtRed;
ninepred[7] = image[iplus][jplus].rgbtRed;
ninepred[8] = image[iplus][jminus].rgbtRed;
//insert green pixel
ninepgreen[0] = image[i][j].rgbtGreen;
ninepgreen[1] = image[i][jplus].rgbtGreen;
ninepgreen[2] = image[i][jminus].rgbtGreen;
ninepgreen[3] = image[iminus][j].rgbtGreen;
ninepgreen[4] = image[iminus][j].rgbtGreen;
ninepgreen[5] = image[iminus][jminus].rgbtGreen;
ninepgreen[6] = image[iplus][j].rgbtGreen;
ninepgreen[7] = image[iplus][jplus].rgbtGreen;
ninepgreen[8] = image[iplus][jminus].rgbtGreen;
//insert blue pixel
ninepblue[0] = image[i][j].rgbtBlue;
ninepblue[1] = image[i][jplus].rgbtBlue;
ninepblue[2] = image[i][jminus].rgbtBlue;
ninepblue[3] = image[iminus][j].rgbtBlue;
ninepblue[4] = image[iminus][j].rgbtBlue;
ninepblue[5] = image[iminus][jminus].rgbtBlue;
ninepblue[6] = image[iplus][j].rgbtBlue;
ninepblue[7] = image[iplus][jplus].rgbtBlue;
ninepblue[8] = image[iplus][jminus].rgbtBlue;
};
//sum of each red, green and blue
for (int z = 0; z < count; z++) {
totalRed += *(ninepred + z);
totalGreen += *(ninepgreen + z);
totalBlue += *(ninepblue + z);
};
// printf("This is totalRed:%i\n", totalRed);
int averageRed = (round)((float)totalRed / count);
int averageGreen = (round)((float)totalGreen / count);
int averageBlue = (round)((float)totalBlue / count);
totalRed = 0;
totalGreen = 0;
totalBlue = 0;
//assign new values of surrounding pixels to that pixel.
image[i][j].rgbtBlue = averageBlue;
image[i][j].rgbtGreen = averageGreen;
image[i][j].rgbtRed = averageRed;
free(ninepred);
free(ninepgreen);
free(ninepblue);
// printf("Blue: %i\nGreen: %i\nRed: %i\n", image[i][j].rgbtBlue, image[i][j].rgbtGreen, image[i][j].rgbtRed);
};
};
printf("Finished");
}
Looking at other people's answers for this same problem. Firstly, I use malloc to create a memory of 3 arrays (ninepred, ninepgreen, ninepblue). Secondly, I check all cases and push red, blue, and green values to these arrays. Thirdly, I use a loop to sum all values in the array and averaged red value, green value, and blue value.Finally, assign it to image[i][j].rgbtBlue, image[i][j].rgbtGreen, image[i][j].rgbtRed but it can't return. I fix it so longtime and hope someone help me.