Ⅰ 這是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');
有問題可以繼續問我,望採納~