CS50 PSet4模糊滤镜问题:运行后始终显示黑屏求排查建议
CS50 PSet4 模糊滤镜黑屏问题排查与修复
你的代码运行后出现黑屏,核心原因是循环逻辑错误和边界判断失误,以下是具体问题和修复方案:
关键错误点
内层循环变量混淆:最内层的两个循环错误地使用外层的
i和j作为终止条件,而非循环自身的变量a和b。这会直接篡改外层循环的索引变量,导致整个图像遍历逻辑彻底混乱。
错误代码片段:for (int a = -1; i <= 1; i++) { for (int b = -1; j <= 1; j++)修正为:
for (int a = -1; a <= 1; a++) { for (int b = -1; b <= 1; b++) }边界判断颠倒且范围错误:
- 行索引
j + b的有效范围是0 <= j+b < height,列索引i + a的有效范围是0 <= i+a < width,你搞反了行、列对应的边界(把行和width比较,列和height比较)。 - 用
>0代替>=0,会漏掉图像第一行和第一列的所有像素。 - 若边界判断错误导致
blurredpx为0,后续除以0会得到NaN,赋值给RGB通道后会变成0,直接引发黑屏。
错误代码片段:
if (j + b > 0 && j + b < width && i + a > 0 && i + a < height)修正为:
if (j + b >= 0 && j + b < height && i + a >= 0 && i + a < width)- 行索引
修正后的完整代码
void blur(int height, int width, RGBTRIPLE image[height][width]) { RGBTRIPLE image_copy[height][width]; // 复制原图像到临时数组,避免修改原数据影响计算 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { image_copy[j][i] = image[j][i]; } } double red_val, blue_val, green_val; int blurredpx; // 遍历图像每个像素 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { red_val = 0; blue_val = 0; green_val = 0; blurredpx = 0; // 遍历当前像素的3x3邻域 for (int a = -1; a <= 1; a++) { for (int b = -1; b <= 1; b++) { // 检查邻域像素是否在图像有效范围内 if (j + b >= 0 && j + b < height && i + a >= 0 && i + a < width) { red_val += image_copy[j + b][i + a].rgbtRed; blue_val += image_copy[j + b][i + a].rgbtBlue; green_val += image_copy[j + b][i + a].rgbtGreen; blurredpx++; } } } // 计算平均值并四舍五入后赋值 image[j][i].rgbtRed = lround(red_val / blurredpx); image[j][i].rgbtBlue = lround(blue_val / blurredpx); image[j][i].rgbtGreen = lround(green_val / blurredpx); } } }
内容的提问来源于stack exchange,提问作者Peter Van Voorhis
相关产品推荐
相关产品推荐

