c - CS50模糊功能未通过check50
问题描述
我正在研究一个 CS50 问题集,其中我需要为图像的每个像素做一个框模糊。虽然我的代码有点多余,因为我为像素的特殊情况(如边缘和角落)创建了许多 if 循环,但它会按预期模糊图像,所以我不确定如何解决这个问题。
这里还有更详细的错误代码(只看“模糊”错误)
我认为会出现此错误,因为该值无法像那样保存(但我在屏幕上打印并取消隐藏)
//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 但它无法返回。我修了这么久,希望有人帮助我。
解决方案
推荐阅读
- c# - 如何将 csc 升级到最新的 roslyn 工具
- c++ - collect2.exe:错误:ld 返回 1 退出状态窗口 7 SE
- tensorflow - MNIST 分类器在非 MNIST 数字上失败
- r - 将动态 UI 保存到全局 R 工作区
- c++ - 使用模板分配器和对对向量进行排序的函数
- ssl - nginx 多个 proxy_pass 使用不同的 ssl 证书和子域到同一个域
- javascript - 如何使用 Firestore 在 Javascript 中实现评论功能
- google-cloud-firestore - 特殊字符在 Firestore 字符串中不起作用
- sql - 如何生成 oracle SQL XML 格式
- ios - 我希望我的三个 textView 具有相同的大小