本文参考至这本书,不是打广告,是分享,真不错的书
中值滤波---用途是去掉图像中的噪点
原理,列如:依次选取图像3x3邻域内的9个像素的灰度,然后按照从小到大的顺序排列。
2 3 3 4 4 5 6 6 10
用中间值(第五个像素值)4代替上图红圈中的6,然后接着向右选取,依次选取图像3x3邻域内的9个像素的灰度,
然后按照从小到大的顺序排列。然后选取中间值,替换掉绿圈中的3。然后又接着向右移动替换,当然还有向下移动替换。
程序如下
/* 中值滤波 image_in 原图像指针 image_out 滤波图像指针 xsize 图像宽度 ysize 图像高度 */ int median_value(u8 c[9])//排序 { u8 i=0,j=0,buf=0; for(j=0;j<8;j++) { for(i=0;i<8;i++) { if(c[i+1]<c[i]) { buf=c[i+1]; c[i+1]=c[i]; c[i]= buf; } } } return c[4]; } void Median(u8 (*image_in)[image_line], u8 (*image_out)[image_line], int xsize, int ysize) { u8 i=0,j=0; u8 c[9]={0}; for(i = 0; i < ysize-1; i++) { for(j = 0; j < xsize-1; j++) { c[0]=*(*(image_in+i-1)+j-1); c[1]=*(*(image_in+i-1)+j); //上 c[2]=*(*(image_in+i-1)+j+1); c[3]=*(*(image_in+i)+j-1); c[4]=*(*(image_in+i)+j); //中 c[5]=*(*(image_in+i)+j+1); c[6]=*(*(image_in+i+1)+j-1); c[7]=*(*(image_in+i+1)+j); //下 c[8]=*(*(image_in+i+1)+j+1); *(*(image_out+i)+j) = median_value(c); } } }
效果
去噪点前
去噪点后
时间: 2024-10-15 06:40:13