CS50模糊滤镜编译正常但未生效,请求错误排查
CS50模糊滤镜问题排查与修复
你的代码存在几个关键逻辑错误,导致模糊效果完全失效,以下是问题点和修复方案:
核心错误点
- 邻居坐标计算错误:当前
currentRow = height + row、currentColumn = width + column的写法完全偏离目标,应该基于当前像素的row和column加上偏移量i、j,即currentRow = row + i,currentColumn = column + j。原写法直接访问了图像范围外的无效内存,根本没拿到目标邻居像素。 - 平均值赋值位置与目标错误:你把计算结果赋值给了
temp[height][width],这是数组越界的位置(数组索引最大为height-1和width-1),而且在i循环每一轮就提前计算,此时邻居像素还没遍历完,平均值不完整。正确的应该是遍历完所有邻居后,把结果赋值给temp[row][column](对应当前处理的像素)。 - 循环逻辑顺序错误:计算平均值的代码应该放在所有邻居遍历完成后,而不是内层
j循环结束后就执行。
修复后的完整代码
// Blur image void blur(int height, int width, RGBTRIPLE image[height][width]) { // 先复制原始图像到临时数组 RGBTRIPLE temp[height][width]; for (int row = 0; row < height; row++) { for (int column = 0; column < width; column++) { temp[row][column] = image[row][column]; } } // 遍历每个像素 for (int row = 0; row < height; row++) { for (int column = 0; column < width; column++) { int totalRed = 0, totalGreen = 0, totalBlue = 0; float counter = 0.0; // 遍历当前像素的3x3邻居(包括自身) for (int i = -1; i < 2; i++) { for (int j = -1; j < 2; j++) { int currentRow = row + i; int currentColumn = column + j; // 跳过超出图像范围的无效像素 if (currentRow < 0 || currentRow >= height || currentColumn < 0 || currentColumn >= width) { continue; } // 累加有效邻居的颜色值 totalRed += temp[currentRow][currentColumn].rgbtRed; totalGreen += temp[currentRow][currentColumn].rgbtGreen; totalBlue += temp[currentRow][currentColumn].rgbtBlue; counter++; } } // 计算平均值并赋值给原图像(基于temp原始值计算,避免修改后的像素干扰) image[row][column].rgbtRed = round(totalRed / counter); image[row][column].rgbtGreen = round(totalGreen / counter); image[row][column].rgbtBlue = round(totalBlue / counter); } } return; }
补充说明:修复后的代码基于temp(原始图像副本)计算颜色总和,避免了修改原图像过程中,已修改像素对后续计算的干扰,这是模糊滤镜的正确逻辑。
内容的提问来源于stack exchange,提问作者wakulovszki
相关产品推荐
相关产品推荐

