程序如下:
clearall;
clc;
I=imread('up4-Amppng');
OutImg=I;
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
R=medfilt2(R,[3,3]);
G=medfilt2(G,[3,3]);
B=medfilt2(B,[3,3]);
I1=cat(3,R,G,B); %对彩色图像R,G,B三个通道分别进行3×3模板的中值滤波cat函数用于连接两个矩阵或数组
R=filter2(fspecial('average',3),R)/255;
G=filter2(fspecial('average',3),G)/255;
B=filter2(fspecial('average',3),B)/255;
I2=cat(3,R,G,B); %对彩色图像R,G,B三个通道分别进行3×3模板的均值滤波
figure,imshow(I);
title('原图')
figure,
imshow(I1);
title('中值滤波')
figure,imshow(I2);
title('均值滤波')
扩展资料:
注意事项
1、在频域滤波,由于是点乘,所以滤波模板矩阵和图像矩阵必须尺寸一样。
2、因为尺寸一样,它们的原点必须要对齐。
3、因在进行离散傅里叶变换后,在频域点乘,相当于在时域卷积,但是这个时候实际上是对时域周期矩阵进行卷积。直接在时域卷积,matlab默认是在边界补0。
4、Matlabfreqz2()这个函数可以自动得到一个指定尺寸的,对应于时域的频域模板。
5、图像经过傅里叶变换后,它的原点在左上角。而模板经过freqz2后,原点在中心,所以只要平移其中的一个就好了。
6、在对原图像进行傅里叶变换之前,按照一定规则补0就好了。
function y = harmonic(x) %声明这个函数(假设x是一行向量)
bad = find(x == 0); %bad是找出x为零项所在的列数
newx = x; %newx与x相等
newx(bad) = []; %除掉newx中的0,如原来为0,1,2,3,运行后为1,2,3,
newx_adj = 1 / newx; %取倒数
mysum = sum(newx_adj(:)); %newx_adj 元素和存储在mysum里
y = prod(size(x)) / mysum; %size(x)是指这个矩阵的大小如x=[0,1,3,5,7],运行后结果为1,5,prod的意思是连乘,就是15,那么结果就是5/mysum的值
%我觉得是你计算 PSNR的方法错了,应该是用最大像素值,
%灰度图像的最大像素值是255, 而不是512。
%另外计算MSE也不用那么麻烦
%下面是计算 MSE和PSNR的程序,我拿一张试了一下,结果肯定是不一样的。
%还有统计像素值出现的次数,用直方图imhist会更简单点,这个程序我没写。
I=imread('boatbmp');
J=imnoise(I,'gaussian',0,001);
Jg=double(J);
%均值滤波
k1=filter2(fspecial('average',3),Jg);
k2=filter2(fspecial('average',5),Jg);
figure,subplot(221),imshow(I);title('原图');
subplot(222),imshow(J);title('加入高斯白噪声以后的图像');
subplot(223),imshow(uint8(k1));title('33模板均值滤波');
subplot(224),imshow(uint8(k2));title('55模板均值滤波');
%中值滤波
k3=medfilt2(Jg,[3 3]);
k4=medfilt2(Jg,[5 5]);
figure,subplot(221),imshow(I);title('原图');
subplot(222),imshow(J);title('加入高斯白噪声以后的图像');
subplot(223),imshow(uint8(k3));title('33模板中值滤波');
subplot(224),imshow(uint8(k4));title('55模板中值滤波');
%计算均值滤波后图像的PMSE与PSNR
diff=(double(I)-k1)^2;
mse=mean(diff(:));
pmse_avg=mse;
max_value=max(k1(:));
psnr=double(10log(max_valuemax_value/mse)/log(10));
%计算中值滤波后的各项指标
diff=(double(I)-k3)^2;
mse=mean(diff(:));
max_value=max(k3(:));
pmse_mid=mse;
psnr_mid=double(10log(max_valuemax_value/mse)/log(10));
以灰度图像eighttif为例,向原始图像中加入高斯噪声,再对噪声图像调用均值滤波函数avefilt进行去噪。
I=imread('eighttif');
G=imnoise(I,'gaussian');
after=avefilt(G,3);
subplot(1,3,1);
imshow(I);
subplot(1,3,2);
imshow(G);
subplot(1,3,3);
imshow(after);
function d=avefilt(x,n)
a=ones(n);
[M,N]=size(x);
x1=double(x);
x2=x1;
for i=1:M-n+1
for j=N-n+1
c=x1(i:i+n-1,j:j+n-1)a;
s=sum(sum(c));
x2(i+fix((n-1)/2),j+fix((n-1)/2))=s/(nn);
end
end
d=uint8(x2);
clear all;
close all;
figure;
I1=imread('cameramanjpg');
subplot(221);
imshow(I1);title('原图像');
I2=imnoise(I1,'salt & pepper');
subplot(222);
imshow(I2);title('加胡椒盐噪声');
M=fspecial('average',33);
I3=imfilter(I2,M);
subplot(223);
imshow(I3);title('工具箱均值滤波');
[m,n]=size(I1);
J=double(I2);
for i=2:m-2
for j=2:n-2
s = J(i-1,j-1)+J(i-1,j)+J(i-1,j+1)+ J(i,j-1)+J(i,j)+J(i,j+1)+J(i+1,j-1)+J(i+1,j)+J(i+1,j+1);
I4(i,j)=s/9;
end
end
subplot(224);
imshow(uint8(I4));title('自编均值滤波');
h
=
ones(N,N)/N^2中,ones(N,N)是
生成一个NN的方阵,元素全是1
。
ones(N,N)/N^2是把方阵中的每个元素除以N^2,也就是方阵的元素全是1/N^2
h
=
ones(N,N)/N^2就是把产生的方阵赋值给变量h
随便写了一个方法,没优化,运行速度有点慢。对于图像范围边界,只跟图像内部点做均值。
clear
all
clc
A=imread('manuo1jpg');
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频域低通滤波,频域高通滤波处理彩色图像的程序全部的内容,包括:用matlab频域低通滤波,频域高通滤波处理彩色图像的程序、matlab调和均值滤波器、一个matlab简单图像处理的程序,共执行了均值,中值滤波,然后计算各个处理后图像的MSE,PSNR等值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)