C语言实现图像处理中值滤波嵌套循环失效、输出灰度值一致问题求助
中值滤波代码问题修复方案
1. 主函数掩膜尺寸校验的致命语法错误
- 问题根源:校验代码中误将不等于运算符
!=写反为=!,等价于执行赋值操作som = !3,由于3是非0值,!3结果为0,所以无论输入什么合法掩膜尺寸,som都会被强制覆盖为0。后续所有和som相关的循环判断条件(如i<som)都不成立,因此循环完全不执行,符合你描述的“循环不生效、打印无输出”的现象。 - 修复代码:
// 原错误代码:if(som=!3 && som!=5 && som!=7) if(som!=3 && som!=5 && som!=7) {printf("\n [size of the mask] should be 3, 5 or 7\n"); exit(0);}
2. 掩膜像素读取逻辑错误
- 问题根源:
sort_masking函数中遍历掩膜的内层循环里,列坐标错误使用了行循环变量i,导致只能读取到掩膜的对角线像素,没有遍历整个掩膜区域,计算的中值完全错误。 - 修复代码:
// 原错误代码:mask_out[i*som+j] = img_mask[rn+i][cn+i]; mask_out[i*som+j] = img_mask[rn+i][cn+j];
3. 迭代次数参数未生效
- 问题根源:
median函数完全没有用到输入的迭代次数参数noi,无论输入多少次迭代,都只会执行1次滤波。 - 修复方案:在
median函数中增加迭代逻辑,每次迭代用上一次的输出作为下一次的输入,示例代码:
unsigned char **median(unsigned char **img, int som, int noi,int NC, int NR){ int i,j, iter; unsigned char **img_out = alloc_img(NC,NR); unsigned char **temp_in, **temp_out, **swap; // 初始化输出为原图 for(i=0;i<NR;i++){ for(j=0;j<NC;j++){ img_out[i][j] = img[i][j]; } } // 迭代noi次 for(iter=0; iter<noi; iter++){ temp_in = img_out; temp_out = alloc_img(NC,NR); for(i=0;i<(NR-som+1);i++){ for(j=0;j<(NC-som+1);j++){ temp_out[i+(som-1)/2][j+(som-1)/2] = sort_masking(temp_in,som,i,j); } } // 交换输入输出,释放临时内存 swap = temp_in; img_out = temp_out; free_img(swap); } return img_out; }
4. 内存泄漏问题修复
- 修复
sort_masking的内存泄漏:每次返回中值前释放malloc的mask_out
unsigned char sort_masking(unsigned char **img_mask,int som, int rn, int cn){ // 原有逻辑不变 unsigned char res = mask_out[(som*som-1)/2]; free(mask_out); // 新增释放逻辑 return res; }
- 修复主函数的内存泄漏:删除多余的
img2 = alloc_img(NC,NR);,因为median函数已经会分配新的内存 - 修复内存释放逻辑:自定义
free_img函数适配你alloc_img的分配结构,不要直接free(img2)
void free_img(unsigned char **img){ free(img[0]); free(img); } // 主函数中释放img2改为调用free_img(img2);
内容的提问来源于stack exchange,提问作者Taylan Mert
相关产品推荐
相关产品推荐

