CS50 Pset4 sepia滤镜公式计算RGB值输出错误求助
CS50 Pset4 Sepia滤镜输出错误排查
测试像素(20, 40, 90)时,预期输出为56 50 39,实际得到39 50 0,问题代码如下:
// Convert image to sepia void sepia(int height, int width, RGBTRIPLE image[height][width]) { int i = 0; int j = 0; int oRed; int oGreen; int oBlue; int sepiaBlue; int sepiaGreen; int sepiaRed; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { oRed = image[i][j].rgbtRed; oGreen = image[i][j].rgbtGreen; oBlue = image[i][j].rgbtBlue; sepiaRed = round((.393 * oRed) + (.769 * oGreen) + (.189 * oBlue)); sepiaGreen = round((.349 * oRed) + (.686 * oGreen) + (.168 * oBlue)); sepiaRed = round((.272 * oRed) + (.534 * oGreen) + (.131 * oBlue)); if (sepiaRed > 255) { sepiaRed = 255; } if (sepiaGreen > 255) { sepiaGreen = 255; } if (sepiaBlue > 255) { sepiaBlue = 255; } image[i][j].rgbtRed = sepiaRed; image[i][j].rgbtGreen = sepiaGreen; image[i][j].rgbtBlue = sepiaBlue; } } return; }
错误原因分析
- 重复赋值覆盖sepiaRed:计算完正确的
sepiaRed后,错误地将原本属于sepiaBlue的公式再次赋值给sepiaRed,导致最终的sepiaRed是原公式中sepiaBlue的计算结果(39),正确的sepiaRed(56)被覆盖丢失。 - sepiaBlue未初始化赋值:变量
sepiaBlue仅声明但从未进行计算赋值,直接使用时会取到栈上的随机值(本次测试中为0),完全不符合预期。
修正后的代码
// Convert image to sepia void sepia(int height, int width, RGBTRIPLE image[height][width]) { int i = 0; int j = 0; int oRed; int oGreen; int oBlue; int sepiaBlue; int sepiaGreen; int sepiaRed; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { oRed = image[i][j].rgbtRed; oGreen = image[i][j].rgbtGreen; oBlue = image[i][j].rgbtBlue; // 正确分配三个通道的计算公式 sepiaRed = round((.393 * oRed) + (.769 * oGreen) + (.189 * oBlue)); sepiaGreen = round((.349 * oRed) + (.686 * oGreen) + (.168 * oBlue)); sepiaBlue = round((.272 * oRed) + (.534 * oGreen) + (.131 * oBlue)); // 确保值不超过255 if (sepiaRed > 255) { sepiaRed = 255; } if (sepiaGreen > 255) { sepiaGreen = 255; } if (sepiaBlue > 255) { sepiaBlue = 255; } image[i][j].rgbtRed = sepiaRed; image[i][j].rgbtGreen = sepiaGreen; image[i][j].rgbtBlue = sepiaBlue; } } return; }
修正后重新测试像素(20,40,90),即可得到预期的56 50 39输出。
内容的提问来源于stack exchange,提问作者Butterworth Filter
相关产品推荐
相关产品推荐

