中值滤波楼上答了,5*5的均值滤波代码 w2=fspecial('average',[5 5]); %% 先定义一个滤波器 h=imfilter(a,w2,'replicate'); %%让图像通过滤波器 imshow(h); imwrite(h,'8.jpg');
成都创新互联-专业网站定制、快速模板网站建设、高性价比名山网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式名山网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖名山地区。费用合理售后完善,十多年实体公司更值得信赖。
均值滤波是
I=medfilt2(a,[3 3],'symmetric')
可以在matlab中查询medfilt函数的用法,本例是使用3*3的滤波器采用镜像边界法做均值滤波。
看主程序:
void main(void)
{
while(1)
{
temp=filter(); //加权平均值滤波
printf("%d\n",temp);
TX_temp(); //未知,可能是串口发送
}
}
主要是这部分
char filter()
{
char i;
char value_buf[N];
int sum=0;
for(i=0;iN;i++) //这个for循环把table中的值赋给value_buf数组
{
value_buf[i]=table[i]; //其实就是 value_buf[4]={10,20,30,65};
delay(500); /不知为何要加延时,本人感觉/毫无意义浪费cpu
}
for(i=0;iN;i++) //关键部分 sum=10*1+20*2+30*3+40*4
sum+=value_buf[i]*mul[i];
return (char)(sum/sum_mul); //返回(10*1+20*2+30*3+40*4)/sum_mul,整数部分
}
这部分代码没什么用,就做了一个简单的运算,加权平均值滤波算法如下:
/*
* 输入 参数:1.需处理数组首地址
* 2.权数组首地址(暂且用power_buf,英文不行)
* 3.数组长度
*/
int filter(char *dat_buf_p, char *power_buf_p, char buf_num)
{
int sum=0;
int sum_mul=0;
for(char i=0; ibuf_num; i++)
{
sum+=(*dat_buf_p)*(*power_buf_p); //数组*权值
sum_mul+=*power_buf_p; //生成权值和
dat_buf_p++; //数组指针加一,指向数组中下一个数
power_buf_p++; //权数组指针加一,指向权数组中下一个权
}
return (int)(sum/ sum_mul);
}
你试试这个函数,有问题跟我说。
1、双循环语句,移动平均法。
p双循环语句,移动平均法/p p%均值滤波/p
pclc,clear;/p
pf=imread('lena.bmp');/p
psubplot(121),imshow(f),title('原图');/p
pf1=imnoise(f,'gaussian',0.002,0.0008);/p
p%subplot(222),imshow(f1),title('添加高斯噪声图');/p
pk1=floor(3/2)+1;/p
pk2=floor(3/2)+1;/p pX=f1;/p
p[M,N]=size(X);/p puint8 Y=zeros(M,N);/p
pfunBox=zeros(3,3);/p pfor i=1:M-3 /p
p for j=1:N-3 /p p funBox=X(i:i+3,j:j+3); /p
p s=sum(funBox(:));/p p h=s/9; /p
p Y(i+k1,j+k2)=h; /p p end;/p
pend;/p pY=Y/255;/p
psubplot(122),imshow(Y),title('均值滤波');/p
p实现图:/p
2、filter2。
pfilter2/p
pclear all;/p
pI=imread('lena.bmp');/p
p%读入预处理图像/p
pimshow(I)/p p%显示预处理图像/p
pK1=filter2(fspecial('average',3),I)/255;/p p%进行3*3均值滤波/p
pK2=filter2(fspecial('average',5),I)/255;/p p%进行5*5均值滤波/p
pK3=filter2(fspecial('average',7),I)/255;/p p%进行7*7均值滤波/p
pfigure,imshow(K1)/p pfigure,imshow(K2)/p
pfigure,imshow(K3)/p
均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
例如,希望对图7-7中位于第5行第5列的像素点进行均值滤波。
根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的5×5矩阵相乘,得到均值滤波的计算结果,如图7-11所示。
将使用的5×5矩阵一般化,可以得到如图7-12所示的结果。
式中,M和N分别对应高度和宽度。一般情况下,M和N是相等的,例如比较常用的3×3、5×5、7×7等。如果M和N的值越大,参与运算的像素点数量就越多,图像失真越严重。
在OpenCV中,实现均值滤波的函数是cv2.blur(),其语法格式为:
式中:
通常情况下,使用均值滤波函数时,对于锚点anchor和边界样式borderType,直接采用其默认值即可。
【例7.2】针对噪声图像,使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况。
从图中可以看出,使用5×5的卷积核进行滤波处理时,图像的失真不明显;而使用30×30的卷积核进行滤波处理时,图像的失真情况较明显。
卷积核越大,参与到均值运算中的像素就会越多,即当前点计算的是更多点的像素值的平均值。因此,卷积核越大,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重。在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。