Ⅰ 这是pic单片机加权平均值滤波 这几个数是怎么运算的 我想知道运算步骤和结果
看主程序:
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;i<N;i++) //这个for循环把table中的值赋给value_buf数组
{
value_buf[i]=table[i]; //其实就是 value_buf[4]={10,20,30,65};
delay(500); /不知为何要加延时,本人感觉/毫无意义浪费cpu
}
for(i=0;i<N;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; i<buf_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);
}
你试试这个函数,有问题跟我说。
Ⅱ 均值滤波的介绍
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
Ⅲ 计算3x3窗口的均值滤波和中值滤波(向下取整保留整数值)。
均值滤波和中值滤波属于空域图像增强的处理方法,均值滤波去麻点,中值滤波保边缘。
要进行均值滤波首先要生成一个3x3矩阵。算法运算窗口一般采用奇数点的邻域来计算中值,最常用的窗口有3X3和5X5模型。
1、通过2个或者3个RAM的存储来实现3X3像素窗口。
2、通过2个或者3个FIFO的存储来实现3X3像素窗口。
3、通过2行或者3行Shift_RAM的存储来实现3X3像素窗口。
(3)均值滤波的算法实现步骤扩展阅读:
注意事项:
1、空间域指图像本身,空域变换直接对图像中的像素进行操作。
2、在进行横向滑动窗口滤波时,窗口中的像素仅仅是丢掉了左侧一列,增加了右侧一列数据,如果丢掉中间重叠的这一部分数据,到下个窗口再重新寻址和读取数据,无疑是计算的沉重负担,所以该算法的核心思想就是充分利用重叠部分,使用直方图来计算中值,不需要排序算法,快,且高效。
3、注意到两个直方图的累加是一个O(1)操作,和直方图的元素个数有关,而直方图元素个数是由图像位深决定的。
Ⅳ 怎样用Matlab循环编程实现均值滤波算法,采用3*3的窗口
随便写了一个方法,没优化,运行速度有点慢。对于图像范围边界,只跟图像内部点做均值。
clear
all
clc
A=imread('manuo1.jpg');
A=im2double(A);
subplot(1,2,1)
imshow(A);
[line,row]=size(A);
lines=0;
rows=0;
linee=0;
rowe=0;
temp=0;
B=[];
for
i=1:1:line
for
j=1:1:row
lines=i-1;
linee=i+1;
rows=j-1;
rowe=j+1;
if
i==1
lines=1;
linee=2;
end
if
i==line
lines=line-1;
linee=line;
end
if
j==1
rows=1;
rowe=2;
end
if
j==row
rows=row-1;
rowe=row;
end
temp=0;
for
m=lines:1:linee
for
n=rows:1:rowe
temp=temp+A(m,n);
end
end
B(i,j)=temp/((linee-lines+1)*(rowe-rows+1));
end
end
subplot(1,2,2)
imshow(B);
Ⅳ 用MATLAB编程实现均值滤波算法
1:smoothingAverageFilterMain.mclc;clear;fid = fopen('lenai.raw');temp= fread(fid, [256,256]);LenaRaw=uint8(temp');subplot(1,2,1) Imshow(LenaRaw);title('原始图像')subplot(1,2,2) Imshow(smoothingAverageFilter(LenaRaw,3));title('自制函数,使用用3*3模板,均值滤波图像')2:smoothingAverageFilter.mfunction returnData=smoothingAverageFilter(arg,arg2)[Iwidth,Ilength]=size(arg);temp=double(arg);returnData=zeros(Iwidth,Ilength);totalLength=arg2*arg2;for i=1:Iwidth-arg2+1 for j=1:Ilength-arg2+1 % temp(i,j)=average(arg(i:i+arg2,j:j+arg2)); sum=0.0; for n=1:arg2 for k=1:arg2 sum=sum+temp(i+n-1,j+k-1); end end returnData(i,j)=sum/totalLength; endendreturnData=uint8(returnData);end
Ⅵ 均值滤波怎么算的
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身)。再用模板中的全体像素的平均值来代替原来像素值。均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
Ⅶ 怎样用MATLAB实现中值和均值滤波
中值滤波楼上答了,5*5的均值滤波代码 w2=fspecial('average',[5 5]); %% 先定义一个滤波器 h=imfilter(a,w2,'replicate'); %%让图像通过滤波器 imshow(h); imwrite(h,'8.jpg');
均值滤波是
I=medfilt2(a,[3 3],'symmetric')
可以在matlab中查询medfilt函数的用法,本例是使用3*3的滤波器采用镜像边界法做均值滤波。
Ⅷ 编写用均值滤波去噪的matlab程序,用两种方法实现.(重谢)
1、双循环语句,移动平均法。
<p>双循环语句,移动平均法</p> <p>%均值滤波</p>
<p>clc,clear;</p>
<p>f=imread('lena.bmp');</p>
<p>subplot(121),imshow(f),title('原图');</p>
<p>f1=imnoise(f,'gaussian',0.002,0.0008);</p>
<p>%subplot(222),imshow(f1),title('添加高斯噪声图');</p>
<p>k1=floor(3/2)+1;</p>
<p>k2=floor(3/2)+1;</p> <p>X=f1;</p>
<p>[M,N]=size(X);</p> <p>uint8Y=zeros(M,N);</p>
<p>funBox=zeros(3,3);</p> <p>fori=1:M-3</p>
<p>forj=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>
<p>end;</p> <p>Y=Y/255;</p>
<p>subplot(122),imshow(Y),title('均值滤波');</p>
<p>实现图:</p>
2、filter2。
<p>filter2</p>
<p>clearall;</p>
<p>I=imread('lena.bmp');</p>
<p>%读入预处理图像</p>
<p>imshow(I)</p> <p>%显示预处理图像</p>
<p>K1=filter2(fspecial('average',3),I)/255;</p> <p>%进行3*3均值滤波</p>
<p>K2=filter2(fspecial('average',5),I)/255;</p> <p>%进行5*5均值滤波</p>
<p>K3=filter2(fspecial('average',7),I)/255;</p> <p>%进行7*7均值滤波</p>
<p>figure,imshow(K1)</p> <p>figure,imshow(K2)</p>
<p>figure,imshow(K3)</p>
Ⅸ MATLAB中编写均值滤波的程序
imageData(y,x,1) = (sum (y1,x1,1))/9;
imageData(y,x,2) = (sum (y1,x1,2))/9;
imageData(y,x,3) = (sum (y1,x1,3))/9;
这一部分没有进行求和的操作啊,根本没有imageData这个量。。。if后边的循环没有实现对3*3的块求和,而是每次赋一个值而已。还有for后边不能加分号,if后边不能加分号,1<x<imageWidth这种语句尽量分成两句:x>1 && x<imageWidth。另建议新建一个矩阵进行存储,可修改如下:
imageData = imread ('file.png');
imageSize = size(imageData);
imageHeight = imageSize(1);
imageWidth = imageSize(2);
Result = imageData;
for y = 1:imageHeight
for x = 1:imageWidth
if (y>1 && y <imageHeight && x>1 && x < imageWidth)
Result(y,x,1) = sum(sum(imageData(y-1:y+1,x-1:x+1,1)))/9;
Result(y,x,2) = sum(sum(imageData(y-1:y+1,x-1:x+1,2)))/9;
Result(y,x,3) = sum(sum(imageData(y-1:y+1,x-1:x+1,3)))/9;
end
end
end
imwrite (Result,'final.png');
有问题可以继续问我,望采纳~