我正在研究一个 CS50 问题集,我需要为图像的每个像素做一个 box blur。虽然我的代码有点多余,因为我为像素的特殊情况(如边缘和角落)创建了许多 if 循环,但它按预期模糊了图像,所以我不确定如何解决这个问题。
还有更详细的错误代码here(只看“blur”错误)
我想犯这个错误是因为值不能那样保存(但我在屏幕上打印并取消隐藏)
//assign new values of surrounding pixels to that pixel.
image[i][j].rgbtBlue = averageBlue;
image[i][j].rgbtGreen = averageGreen;
image[i][j].rgbtRed = averageRed;
这是我的代码如下:
// 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");
}
查看其他人对同一问题的回答。首先,我使用 malloc 创建了 3 个数组(ninepred、ninepgreen、ninepblue)的内存。其次,我检查所有情况并将红色、蓝色和绿色值推送到这些数组。第三,我使用循环对数组中的所有值求和并平均红色值、绿色值和蓝色值。最后,将其分配给 image[i][j].rgbtBlue, image[i][j].rgbtGreen, image[i][j].rgbtRed 但它无法返回。我修复了很长时间,希望有人帮助我。