CS50x PSET4 filter-more的blur函数边角像素滤波异常排查
CS50x PSET4 filter-more blur函数边缘像素计算错误排查
问题根因
你的代码对所有像素的邻域RGB总和固定除以9计算平均值,是边缘、角落像素结果错误的唯一核心原因:
- 图像非边缘的中间区域像素,3x3邻域共9个像素全部落在图像范围内,除以9的计算逻辑完全正确,对应你观察到的中间区域结果符合预期的现象
- 图像非角落的边缘像素,3x3邻域有3个像素超出图像边界,实际参与计算的有效像素仅6个,固定除以9会导致计算出的平均值偏低
- 图像四个角落的像素,3x3邻域有5个像素超出图像边界,实际参与计算的有效像素仅4个,固定除以9的计算结果偏差会更明显
修正方向
不需要改动你现有的边界判断逻辑,只需要补充有效像素计数即可:
- 在遍历每个像素的两层循环内部、开始遍历3x3邻域之前,新增一个整型计数器变量,初始值设为0
- 每次判定邻域坐标合法、累加RGB通道总和的时候,同步给计数器加1
- 计算三个通道平均值时,将固定除以
9.0的逻辑改为除以计数器转成的浮点数,再做round取整
修正后的核心代码片段
for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { // 统计当前像素邻域内的有效像素个数 int valid_count = 0; red_total = blue_total = green_total = 0; for (int h = -1; h < 2; h++) { if (i + h >= 0 && i + h < height) { for (int k = -1; k < 2; k++) { if (j + k >= 0 && j + k < width) { red_total += image[i + h][j + k].rgbtRed; blue_total += image[i + h][j + k].rgbtBlue; green_total += image[i + h][j + k].rgbtGreen; // 有效像素计数累加 valid_count++; } } } } // 按实际有效像素数计算平均值 red_average = round(red_total / (float)valid_count); blue_average = round(blue_total / (float)valid_count); green_average = round(green_total / (float)valid_count); temp[i][j].rgbtBlue = blue_average; temp[i][j].rgbtRed = red_average; temp[i][j].rgbtGreen = green_average; } }
注:你原代码里的临时数组创建、遍历后拷贝回原图像、总和变量重置的逻辑都是正确的,不需要改动。代码中多余的
else continue语句不影响运行结果,仅属于冗余写法,可自行选择是否删除。
内容的提问来源于stack exchange,提问作者camelCoder
相关产品推荐
相关产品推荐

