%说明:利用Matlab自的滤波器对图像进行平滑处理,噪声得到了有效的去除 %并且选择模版的尺寸越大,噪声的去除效果越好,同时图像边缘细节越模糊 I=imread('lena.jpg'); %打开图像
I=rgb2gray(I); %RGB彩色图像转化为灰度图像 figure, subplot(1,3,1),imshow(I),title('原图像'); %添加高斯噪声,均值为0,方差为0.02 M=imnoise(I,'gaussian',0,0.05);
subplot(1,3,2),,imshow(M),title('加噪图像'); %第一种方法:用filter2函数进行滤波处理 J=filter2(fspecial('average',3),M)/255;
subplot(1,3,3),,imshow(J),title('滤波后的图像');; %第二种方法:用conv2卷积函数进行滤波处理 %2.1 创建均值滤波器模版 H1=ones(3)/9; %3x3邻域 H2=ones(7)/49; %7x7邻域 %2.2 转化M为double数据类型 M=double(M); %2.3 均值滤波 G1=conv2(M,H1,'same'); G2=conv2(M,H2,'same'); %2.4 图像显示 figure,
subplot(2,2,1), imshow(I); title('原始图像'); subplot(2,2,2), imshow(M,[]), title('添加高斯噪声图像'); subplot(2,2,3); imshow(G1,[]); title('3*3均值滤波图像'); subplot(2,2,4); imshow(G2,[]); title('7*7均值滤波图像'); disp('程序成功结束')
图1 实验结果
2、自编程序均值滤波实验。
n 在Matlab中,建立M文件Lab3_Test2.m,编写如下代码,对噪声图像进行均值滤波处理,且分析对
比实验结果。代码如下: function Lab3_Test2_Main()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc;close all;clear all;
18
%这个相当于主程序,打开图像,调用自己编写的子程序,对图像进行处理 Img = imread('lena.jpg'); %打开图像
K=5; %邻域半径,自己改此值,对比滤波效果 II=MyMeanFilter(Img,K); %调用自编直方均衡化 disp('Run OK') %主程序到此结束,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %说明:自己编写的邻域平均法滤波子函数,K为邻域半径
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function I=MyMeanFilter(Img,K) %直方图均衡化 略(自己编写程序)
图2 实验结果
3、中值滤波实验。
n 在Matlab中,建立M文件Lab3_Test3.m,编写如下代码,实现中值滤波功能对噪声图像进行滤波处
理,且分析对比实验结果。代码如下: function Lab3_Test3_Main()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc;close all;clear all;
%这个相当于主程序,打开图像,调用自己编写的中值滤波子程序,对图像进行处理 Img = imread('lena.jpg'); %打开图像
K=5; %邻域半径,自己改此值,对比滤波效果 II=MyMedfilt2(Img,K); %调用自编直方均衡化 disp('Run OK') %主程序到此结束,
%说明:Matlab自带中值滤波函数medfilt2()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %说明:自己编写的中值滤波子函数,K为邻域半径
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function I=MyMedfilt2(Img,K) %直方图均衡化 略(自己编写程序)
19
图3 实验结果
4、锐化滤波实验。
n 以下图所示模板为例,在Matlab中,建立M文件Lab3_Test4.m,参照上述编程风格,自己编写程序实
现“拉普拉斯图像锐化”功能,且分析对比实验结果。
0 1 0
五、实验内容及要求
1、在MATLAB中,严格完成上述实验内容,且分析比较实验结果;
2、打开其他灰度图像,利用MATLAB工具箱所提供的函数为图像添加高斯、椒盐等噪声; 3、利用相应的MATLAB工具箱所提供的函数对图像进行平滑或锐化处理; 4.参照上述程序,自己编程实现:
1)编写一个函数,实现邻域平均滤波功能; 2)编写一个函数,实现加权平均滤波功能; 3)编写一个函数,实现中值滤波功能; 4)编写一个函数,实现锐化滤波功能;
5.查找资料,在VS2010环境,调用OpenCV函数,实现图像平滑滤波(如:中值滤波、高斯平滑等)功能,对图像进行去噪处理。
1 -4 1
0 1 0
20
实验四:图像变换及频谱分析实验
一、实验目的:
1、熟悉傅里叶变换与DCT的基本性质; 2、掌握FFT与DCT方法与应用; 3、通过实验了解二维频谱的分布特点;
4、通过本实验掌握利用MATLAB编程实现数字图像的傅立叶与DCT变换及应用。 二、实验设备:
1、PC机或笔记本电脑,Windows操作系统; 2、安装Matlab软件,准备实验相关图像或M文件;
3、按照如下实验内容与步骤,编写相应Matlab程序,完成实验任务。 三、实验原理:
数字图像处理的方法有两类:空间域处理法和频域法。频域法首先是要将图像从空间域变换到频率域,然后在频率域对图像进行各种处理,再将所得到的结果进行反变换,从而达到图像处理的目的,频域法具有很多明显的优点。目前,频域变换被广泛运用于图像特征提取、图像增强、图像复原、图像数据压缩和图像识别等领域。
(1)离散傅立叶变换(DFT)
离散傅立叶变换(DFT)在数字信号处理和数字图像处理中应用十分广泛。使用离散傅立叶变换的根本原因有二:一是DFT的输入、输出均为离散形式的,这使得计算机非常容易操作;二是因为计算DFT存在快速算法,即快速傅立叶变换(FFT),因而计算比较方便。令f(x,y)表示一幅大小为M×N的图像,其中x=0,1,2,…,M-1和y=0,1,2,…,N-1。其离散傅立叶变换对为:
F(u,v)=??f(x,y)e-j2p(uxM+vy
x=0y=0
M-1N-1
N) (1)
1
f(x,y)=
MN
M-1N-1u=0v=0
??F(u,v)e
j2p(uxM+vyN) (2)
空间域是由f(x,y)所组成的坐标系,其中x和y用作(空间)变量。频率系统是由F(u,v)所组成的坐标系,其中u和v用作(频率)变量。由u=0,1,2,…M-1和v=0,1,2,…N-1定义的M×N矩形区域常称为频率矩形。显然,频率矩形的大小与输入图像的大小相同。为了与MATLAB的实现形式相一致,将1/MN项放置于逆变换公式的前面。由于MATLAB中的数组索引是以1而不是以0开头的,所以MATLAB中的F(1,1)和f(1,1)相应于正变换和逆变换中的数字量F(0,0)和f(0,0)。在频域原点处变换值[如F(0,0)]称为傅立叶变换的直流(dc)分量,F(0,0)等于f(x,y)的平均值的MN倍。
MATLAB图像处理工具箱提供了一些函数来进行傅立叶变换: ? 函数:fft2——用于计算二维快速傅立叶变换。调用格式为:
Y = fft2(X); 或 Y = fft2(X,M,N);
其中X是输入图像矩阵,Y是X进行二维傅立叶变换后的图像矩阵;X和Y大小相同。在Y=fft2(X,M,N)中,按照M、N指定的值对图像进行剪切或补0后进行傅立叶变换,返回变换矩阵的大小为M×N。变换结果的左上、右上、左下、右下四个角的周围对应于低频成分,中央部位对应于高频成分。
? 函数:ifft2——用于计算图像的二维傅立叶反变换。其调用格式为:
Y = ifft2(X);或 Y = ifft2(X,M,N);
其中ifft2用于返回图像的二维傅立叶反变换矩阵,其参数定义同fft2。
(2)离散余弦变换(DCT) 离散余弦变换(DCT, Discrete Cosine Transform)的变换核为实数的余弦函数,因而DCT的计算速度要
21
比变换核为复指数的DFT要快得多。离散余弦变换是仅次于K-L变换的次最佳正交变换,且有这样的性质:许多有关图像的重要可视信息都集中在DCT变换的一小部分系数中,因此已被广泛应用到图像压缩编码、语音信号处理等众多领域,并成为许多图像编码国际标准的核心。
MATLAB图像处理工具箱实现离散余弦变换有两种方法:其一是使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的输入方阵时的计算速度。其二是使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16)
提供DCT函数分别为:
? 函数:dct2——实现图像的二维离散余弦变换。调用格式为:
B = dct2(A); B = dct2(A,[M N]); B = dct2(A,M,N);
其中A表示要变换的图像,M和N是可选参数,表示填充后的图像矩阵大小,如果m和n比图像A小,则进行变换之前,将图像A进行剪切,B表示变换后得到的图像矩阵,各元素为离散余弦变换的系数B(k1,k2)。
? 函数:idct2——实现图像的二维离散余弦反变换。调用格式为:
B = idct2(A); B = idct2(A,[M N]); B = idct2(A,M,N);
四、练习内容
启动电脑,打开MATLAB编程编程环境,依次完成下列所有实验: 1、图像的付立变换实验。
n 在Matlab中,建立M文件Lab4_Test1.m,编写如下代码,打开灰度图像,进行FT变换,显示频谱信
息,并进行逆付立叶变换恢复图像。代码如下: function Lab4_Test1()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc;close all;clear all;
%说明:打开进行FFT变换,显示频谱,再进行IFFT变换恢复图像 %1 打开图像
Img = imread('lena.jpg'); %打开图像 [H,W,dim] = size(Img); if (dim>1)
Img =rgb2gray(Img); %若打开的为彩色图像,则先转化成灰度图像 end
figure,subplot(1,3,1),,imshow(Img),title('原图像'); %2 图像FT变换及频谱 F=fft2(Img); F=fftshift(F);
%计算二维傅里叶变换 %将原零点移到频谱图的中心
%显示变换后的频谱图
subplot(1,3,2),,imshow(log(abs(F)+1),[0 10]),title('频谱'); %3 图像IFT变换
F1=ifftshift(F); %系数逆中心化
22