BMG图像模糊滤镜代码问题:本地正常但自动Grader不通过
问题分析:模糊滤镜自动评分不通过的原因
你的代码逻辑框架正确(先复制原图到临时数组再计算模糊),但边界像素的判断条件完全错误,导致计算平均值时读取了越界的内存数据,最终结果不符合评分标准。
错误点详解
当前的边界判断代码:
if(w >= 0 && w < width && q >= 0 && q < height)
这段代码错误地判断了偏移量q和w的范围,而非偏移后的目标像素坐标。正确逻辑应校验:i+q(行号)需满足0 <= 行号 < height,j+w(列号)需满足0 <= 列号 < width。
举个反例:处理最后一行像素(i = height - 1)时,若q = 1,偏移后的行号为height,已超出图像范围,但你的条件中q=1 < height成立,会错误访问TEMP[height][j+w],读取无效内存数据,导致该像素RGB平均值计算错误。
修正后的代码
将边界判断替换为正确的坐标校验即可:
// 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].rgbtRed = image[i][j].rgbtRed; TEMP[i][j].rgbtGreen = image[i][j].rgbtGreen; TEMP[i][j].rgbtBlue = image[i][j].rgbtBlue; } } for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) { float count = 0; float red = 0; float green = 0; float blue= 0; for(int q = -1; q < 2; q++) { for(int w = -1; w < 2; w++) { // 修正:判断偏移后的坐标是否在图像有效范围内 if((i + q) >= 0 && (i + q) < height && (j + w) >= 0 && (j + w) < width) { red += TEMP[i+q][j+w].rgbtRed; green += TEMP[i+q][j+w].rgbtGreen; blue += TEMP[i+q][j+w].rgbtBlue; count ++; } } } image[i][j].rgbtRed = round(red/count); image[i][j].rgbtGreen = round(green/count); image[i][j].rgbtBlue = round(blue/count); } } }
补充说明
替换后,所有边界像素的模糊计算都会只取图像内存在的相邻像素求平均,不会读取无效数据,计算结果会完全符合自动评分的预期。
内容的提问来源于stack exchange,提问作者Neuquert
相关产品推荐
相关产品推荐

