CS50 PSET4 Box Blur滤镜程序输出黑色图片,求错误排查
盒子模糊(Box Blur)代码输出黑色图片的问题排查
你的代码运行后输出黑色图片,核心问题有两个:
- 未初始化sum变量:你定义了
RGBTRIPLE sum;但没有将它的rgbtRed、rgbtGreen、rgbtBlue分量初始化为0。这些变量会保留内存中的随机垃圾值,累加后结果完全错误,最终计算出的平均值大概率是0或接近0的数值,导致图片全黑。 - 边界判断逻辑错误:判断像素是否越界时,
xarr[x] > width和yarr[y] > height的写法错误。图像的列索引范围是0到width-1,当xarr[x]等于width时就已经超出有效范围,应该改成xarr[x] >= width;同理行索引范围是0到height-1,判断条件要改成yarr[y] >= height。之前的错误会导致访问非法内存,进一步加剧数值异常。
另外,你遍历周围9个像素的写法比较绕,换成双重循环会更清晰,也不容易出错。修正后的代码如下:
// Blur image void blur(int height, int width, RGBTRIPLE image[height][width]) { // 临时存储原始图像像素,避免计算时覆盖 RGBTRIPLE temp[height][width]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { temp[i][j] = image[i][j]; } } for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int sum_red = 0, sum_green = 0, sum_blue = 0; int count = 0; // 遍历当前像素周围3x3的区域 for (int dy = -1; dy <= 1; dy++) { for (int dx = -1; dx <= 1; dx++) { int y = i + dy; int x = j + dx; // 判断是否在图像范围内 if (y >= 0 && y < height && x >= 0 && x < width) { sum_red += temp[y][x].rgbtRed; sum_green += temp[y][x].rgbtGreen; sum_blue += temp[y][x].rgbtBlue; count++; } } } // 计算平均值并赋值 image[i][j].rgbtRed = round((float)sum_red / count); image[i][j].rgbtGreen = round((float)sum_green / count); image[i][j].rgbtBlue = round((float)sum_blue / count); } } return; }
内容的提问来源于stack exchange,提问作者need-help
相关产品推荐
相关产品推荐

