3利用卷积公式对图像的没一个像素进行处理,得到滤波后的图像。 4.用imshow显示滤波后的图像。 三、Matlab源代码 1.均值滤波源码: clear all clc
img=imread('2.jpg');
[row,column,band]=size(img); img0=double(img);
f11=1/9; f12=1/9; f13=1/9; f21=1/9; f22=1/9; f23=1/9; f31=1/9; f32=1/9; f33=1/9;
img1=[img0(:,1,:), img0(:,:,:), img0(:,column,:)]; img2=[img1(1,:,:); img1(:,:,:); img1(row,:,:)]; filtered=zeros(row,column,band); for ii=1: row for jj=1: column
filtered(ii,jj,:)=f11*img2(ii,jj,:) + f12*img2(ii,jj+1,:) + f13*img2(ii,jj+2,:)+ ...
f21*img2(ii+1,jj,:) + f22*img2(ii+1,jj+1,:) + f23*img2(ii+1,jj+2,:) + ...
f31*img2(ii+2,jj,:) + f32*img2(ii+2,jj+1,:) + f33*img2(ii+2,jj+2,:); end end
filtered1=uint8(filtered);
subplot(1,2,1),imshow(img);title('图1 原始RGB图像');
subplot(1,2,2),imshow(filtered1);title('图2 均值滤波后的图像'); imwrite(filtered1,'flower_filtered_mean.jpg'); 2.中值滤波代码:
image = imread('flower.jpg'); [m,n,p] = size(image); image0 = double(image);
image1=[image0(:,1,:), image0(:,:,:), image0(:,n,:)]; image2=[image1(1,:,:); image1(:,:,:); image1(m,:,:)]; clear image1
image1 = zeros(m,n,p); for i = 1:m for j = 1:n
A = image2(i:i+2,j:j+2,:); B = sort(A); midum = B(2,2,:); image1(i,j,:) = midum; end
end
image1 = uint8(image1);
subplot(1,2,1),imshow(image);title('图1:原始的RGB图像'); subplot(1,2,2),imshow(image1);title('图2:中值滤波后的图像'); 3.边缘提取滤波源代码 clear all
img=imread('2.jpg'); [row,column,band]=size(img); img0=double(img); f11=1; f12=0; f13=-1; f21=1; f22=0; f23=-1; f31=1; f32=0; f33=-1;
img1=[img0(:,1,:), img0(:,:,:), img0(:,column,:)]; img2=[img1(1,:,:); img1(:,:,:); img1(row,:,:)]; filtered=zeros(row,column,band); for ii=1: row for jj=1: column
filtered(ii,jj,:)=f11*img2(ii,jj,:) + f12*img2(ii,jj+1,:) + f13*img2(ii,jj+2,:)+ ...
f21*img2(ii+1,jj,:) + f22*img2(ii+1,jj+1,:) + f23*img2(ii+1,jj+2,:) + ...
f31*img2(ii+2,jj,:) + f32*img2(ii+2,jj+1,:) + f33*img2(ii+2,jj+2,:); end end
filtered1=uint8(filtered);
subplot(1,2,1),imshow(img);title('图1 RGB原图像');
subplot(1,2,2),imshow(filtered1);title('图2 边缘提取后的图像'); imwrite(filtered1,'flower_filtered_edge.jpg');
四、运行结果
图1:原始RGB图像 图2:均值滤波后的图像
图3:中值滤波后的图像 图4:边缘提取后的图像
实习3 傅里叶变换、傅里叶逆变换,及频域滤波
一、实验目的
按照信号处理理论,根据滤除的频率特征,滤波有3种:1.低通滤波。低通滤波是对频率域的图像通过滤波器H(u,v)削弱或抑制高频部分而保留低频部分的滤波方法。由于图像上的噪声主要集中在高频部分,所以低通滤波可以起到压抑噪声的作用。同时,由于强调了低频成分,图像会变得比较平滑。2.高通滤波。高通滤波是对频率域的图像通过滤波器来突出图像的边缘和轮廓,进行图像锐化的方法。3.带通滤波。仅保留指定频率范围的滤波,范围外的频率被阻止。
将空间域中的图像变换到频率域中进行计算。空间增强技术强调像元位置和像元之间的关系,但随着考虑的像元数目增多,计算的复杂度增加而且非常耗费计算运算时间,特别是当模板越来越大时,这种现象尤为明显。 频率域增强方法:
1.频率域平滑:保留图像的低频部分而抑制高频部分。 2.频率域锐化:保留图像的高频部分而削弱低频部分。 首先将空间域图像f(x,y)通过傅立叶变换为频率域图像F(u,v),然后选择合适的滤波器H(u,v)对F(u,v)的频谱成分进行增强得到图像G(u,v),再经过傅立叶逆变换将
G(u,v)变换到空间域,得到增强后的图像g(x,y)。
根据傅里叶变换的原理,用Matlab实现对图像的傅里叶变换,再设计各种频率滤波器,包括理想滤波器、巴特沃斯滤波器、指数滤波器等高通或低通滤波器,用这些滤波器对频率图像进行滤波,将得到的滤波后的频率图像经过傅里叶逆变换后得到想要的图像。本实验,对这些滤波器都进行了设计,处理结果如下图: 二、算法描述
1.读取RGB图像,并获得其某个波段。
2.调用fft2对某波段进行傅里叶变换,用fftshift频移函数,使得图像的低频部分移动到频谱的中心。
3.设置低通高通滤波器,对频谱图像进行滤波处理,去除其高频或低频部分。 4.用ifft2对频谱图像进行逆傅里叶变换,得到滤波后的图像。 5.对图像进行归一化,使像素值在0-255之间。 6. imshow显示频谱图像和滤波后的图像。
三、Matlab源代码 1.理想低通滤波源代码 clear all
a=imread('2.jpg'); [X,Y,Z]=size(a);
a1=a(:,:,1); b1= fft2(a1); b2= fftshift(b1); F=abs(b2); h=zeros(X,Y);
cutoff=0.7; threshold=1-cutoff; lowx=round(X/2-threshold*X/2); upx=round(X/2+threshold*X/2); lowy=round(Y/2-threshold*Y/2); upy=round(Y/2+threshold*Y/2); h(lowx:upx,lowy:upy)=1; lowpass=b2.*h; d0=ifft2(lowpass); result=abs(d0); result=uint8(result); F1=log10(reshape(F, X*Y,1));
F2=uint8( ((F1 - min(F1))/(max(F1) - min(F1)))*255); F3=reshape(F2, X, Y);
subplot(1,3,1), imshow(F3), title('Fig.1 ?傅里叶频谱'); subplot(1,3,2), imshow(h), title('Fig.2 理想低通滤波器'); subplot(1,3,3), imshow(result),title('Fig.3 ?理想低通滤波结果');
2.巴特沃斯低通滤波代码: clear all
a=imread('2.jpg'); [X,Y,Z]=size(a);
a1=a(:,:,1);b1= fft2(a1); b2= fftshift(b1); F=abs(b2); h=zeros(X,Y); lowpass=zeros(X,Y); n1=round(X/2); n2=round(Y/2);
dmax=sqrt(n1^2 + n2^2);
cutoff=0.7;d0=(1-cutoff) * dmax; n=3; for x=1:X for y=1:Y
d=sqrt((x-n1)^2+(y-n2)^2); h(x,y)=1/(1+(d/d0)^(2*n)); lowpass(x,y)=b2(x,y).*h(x,y);
相关推荐: