CS50x PSet4 Blur模糊函数 原始像素值读取异常问题排查
问题定位
你提前拷贝temp数组的思路是对的,异常值和计算结果错误来自三个代码逻辑错误,和指针本身用法无关:
- 正西侧邻域索引越界:在判断西侧像素存在(
w-1 >=0)的代码块中,你传入的像素地址是&temp[h - 1][w - 1],这是西北方向的像素坐标,不是正西侧的temp[h][w-1]。当处理第一行(h=0)像素时,h-1=-1,直接访问了temp数组边界外的栈内存,读到的是系统随机残留值,这就是你看到R=49、G=247、B=0这类异常数值的直接原因。 - 对角邻域方位完全写反:代码里四个对角的注释和实际坐标不匹配,东北、西北、东南、西南四个方向的判断逻辑全部错位,会漏算、错算邻域像素。
- 像素重复计数:你在南北行的判断逻辑中已经统计过对应行的对角像素,后续单独判断东西邻域时又重复累加了对角像素值,cellCounter计数大于实际邻域数量,最终均值计算结果必然错误。
修复方法
不要零散手写每个邻域的坐标判断,很容易出索引错误,直接用双层偏移量循环遍历所有3*3邻域,跳过越界坐标即可,替换掉原来零散的邻域统计代码:
int totalRed = 0; int totalGreen = 0; int totalBlue = 0; float cellCounter = 0.0; // 遍历当前像素周围3*3范围的所有偏移 for (int dh = -1; dh <= 1; dh++) { for (int dw = -1; dw <= 1; dw++) { int cur_h = h + dh; int cur_w = w + dw; // 坐标超出图像范围直接跳过 if (cur_h < 0 || cur_h >= height || cur_w < 0 || cur_w >= width) { continue; } rgbAdd(&temp[cur_h][cur_w], &totalRed, &totalGreen, &totalBlue); cellCounter += 1.0; } }
替换后用你给出的3×3测试用例验证,Block(0,1)的邻域共6个有效像素,计算得R均值为80、G均值约95、B均值约105,完全符合CS50检查器的预期结果。
内容的提问来源于stack exchange,提问作者FlyingHamster839
相关产品推荐
相关产品推荐

