您的当前位置:首页正文

数字图像处理在matlab中的基本操作

来源:客趣旅游网
数字图像处理在matlab中的应用

1. 图像的缩放

图像的缩放是图像的空间域变换操作,可以认为是在输入图像和输出图像之间进行像素-像素变换。图像插值操作是图像缩放的基本方法,基本原理是,估计像素点之间位置的像素值,将输入图像和输出图像的变换在数字图像的约束下得以完善,有效的填充图像可能出现的空白点。

图像的插值包括三种方法:1.最近邻插值,该算法中,输出图像中每一个像素点的值就是与该点在输入图像中变换位置最临近采样点的值。2.双线性插值,该方法的输出像素值是它在输入图像中2*2邻域采样点的平均值。3.双三次插值,相比于双线性插值,其插值邻域大小为4*4,插值效果好,但相应计算量也较大。

Matlab图像处理工具箱中的函数imresize可以对图像进行缩放操作,同时指定以上所介绍的插值方法作为其函数。以下基于matlab实现图像“hd1.bmp”的不同方式的缩放(这里设置放大倍数为2倍)

%图像缩放操作代码:

>> J=imread('hd1.bmp'); %图像的读入

>> x1=imresize(J,2); %将图像以最近邻插值放大两倍 >> x2=imresize(J,2,'bilinear'); %将图像以双线性插值放大两倍 >> x3=imresize(J,2,'bicubic'); %将图像以双三次插值放大两倍 >> figure,imshow(J) %图像输出显示 >> figure,imshow(x1) >> figure,imshow(x2) >>figure,imshow(x3)

输入输出图像对比

图1-1 原图输出

图1-2 最近邻插值放大2倍输出

图1-3 双线性插值放大2倍输出

图1-4双三次插值放大2倍输出

2. 图像的点处理-灰度变换/直方图调整

点处理是通过像元亮度值(灰度值)的变换来实现的。灰度变换是一种简单实用的方法,它可使图像动态范围增大,图像对比度扩展,图像变清晰,特征明显。灰度变换可以分为比例线性变换、分段线性变换和非线性灰度变换。

2.1 比例线性变换

比例线性变换是对单波段逐个像元进行处理的,它是将原图亮度值动态范围按线性关系式扩展到指定范围或整个动态范围。假定原图像f(x,y)的灰度范围是[a,b],希望变换后图像的动态范围是[c,d],则可以用一下公式来实现变换:

f(x,y)(dc)[f(x,y)a] c (1-1)

ba

以下是比例线性变换的程序设计及实现:

>> x=imread('airforce.bmp'); %图像文件读入

>> I=rgbgray2(x); %该语句由后期修改,修改后影响原图输出效果 >> figure,imshow(I); %原图显示输出 >> f0=0;g0=0; >> f1=10;g1=10; >> f2=180;g2=1800;

>> f3=255;g3=255; %定义点以确定线段(此处随机定义) >> figure,plot([f0,f1,f2,f3],[g0,g1,g2,g3])

>> axistight,xlabel('f'),ylabel('g')

>> title('intensitytransformation') %绘制变换曲线 >> r1=(g1-g0)/(f1-f0); >> b1=g0-r1*f0;

>> r2=(g2-g1)/(f2-f1); >> b2=g1-r2*f1;

>> r3=(g3-g2)/(f3-f2);

>> b3=g2-r3*f2; %根据变量曲线点求出变量关系式 >> [m,n]=size(I); >> J=double(I); >> for i=1:m for j=1:n f=J(i,j); g(i,j)=0;

if(f>=f1)&(f<=f2) g(i,j)=r1*f+b2;

elseif(f>=f2)&(f<=f3)

g(i,j)=r3*f+b3; %计算各图像元变换后灰度值 end

end end

>> figure,imshow(mat2gray(g)) %输出变换后灰度图像

以下是程序运行结果:

图2-1 原图像

图2-2 绘制出的变换曲线

图2-3 比例线性变换处理后图像输出

2.2 分段线性变换

分段线性变换是为了突出人们感兴趣的目标或亮度值区间,要求局部扩展亮度值范围。它可以有效地利用有限个灰度级,达到最大限度增强图像中有用信息的目的。假设感兴趣的区域是(a,b),可以采用以下的分段变换公式:

f(x,y)acg(x,y)df(x,y)b(dc)[f(x,y)a]/(ba)c,af(x,y)b (2-2) 

下面利用分段线性变换来对图像进行处理,假定感兴趣的区间是(30,180),可以得到分段线性变换程序如下:

%分段线性变换

>> x=imread('airforce2.bmp');

>> I=rgbgray2(x); %该语句由后期修改,修改后影响原图输出效果 >> figure,imshow(I) %显示原图像 >> f0=0;g0=0; >> f1=30;g1=10; >> f2=180;g2=220;

>> f3=255;g3=255; %设点,给出感兴趣的区间 >> figure,plot([f0,f1,f2,f3],[g0,g1,g2,g3]) >> axistight,xlabel('f'),ylabel('g')

>> title('分段线性变换曲线') %绘制变换曲线

>> r1=(g1-g0)/(f1-f0); >> b1=g0-r1*f0;

>> r2=(g2-g1)/(r2-r1); >> r2=(g2-g1)/(f2-f1); >> b2=g1-r2*f1;

>> r3=(g3-g2)/(f3-f2);

>> b3=g2-r3*f2; %求变换关系式 >> [m,n]=size(I); >> J=double(I); >> for i=1:m for j=1:n f=J(i,j); g(i,j)=0;

if(f>=f1)&(f<=f2) g(i,j)=r1*f+b2;

elseif(f>=f2)&(f<=f3) g(i,j)=r3*f+b3; end end end

>> figure,imshow(mat2gray(g)) %输出变换后图像

运行以上程序,得到结果:

图3-1 原图像

图 3-2 分段变换的变换曲线

图3-3 分段线性变换处理后图像输出

2.3 非线性灰度变换

非线性灰度变换对于要进行扩展的亮度范围是有选择的,扩展的程度是随着亮度值的变化而连续变化的,有两种方法:

(1) 对数变换,作用对图像的低亮度区有较大的扩展而对高亮度区压缩。 (2) 指数变换,此种变换可以对图像的高亮度区给予较大的扩展。

下面以对数变换为例,其目的与增强对比度相反,当原图的动态范围太大,超出了某些显示设备所允许的动态范围时,可采用对数形式的变换函数进行动态范围压缩:g=c log(1+f)。

其中c是比例尺常数,下面采用对数形式的变换函数设计实现图像动态范围压缩:

% 以对数变换对图像进行非线性灰度处理 >> x=imread('nv3.bmp');

>> I=rgbgray2(x); %该语句后期由修改 >> figure,imshow(I)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262 >> c=255/log(256); >> x=0:1:255; >> y=c*log(1+x); >> figure,plot(x,y)

>> axistight,xlabel('f'),ylabel('g') >> title('对数变化曲线') >> [m,n]=size(I); >> J=double(I); >> for i=1:m for j=1:n g(i,j)=0;

g(i,j)=c*log(J(i,j)+1); end end

>> figure,imshow(mat2gray(g))

运行以上程序得出结果:

图 4-1 原图像

图 4-2 对数变换曲线

图 4-3 对数变换后图像效果显示

2.4 直方图均衡化

一般情况下,如果图像的灰度分别集中在较窄的区间,从而引起图像细节的模糊,为了使图像细节清晰,并使一些目标得到突出,达到增强图像的目的,可通过改善各部分亮度的比例关系,即通过直方图的方法来实现。

直方图均衡化是将一已知灰度概率密度分布的图像,经过某种变换变成一幅具有均匀灰度概率密度分布的新图像,其结果是扩展了像元取值的动态范围,从而达到了增强图像对

比度的效果。

下面是直方图均质化的变换源程序:

>> x=imread('nv.bmp'); %图像文件读入 >> y=rgb2gray(x);

> In imuitools\\private\\initSize at 73 In imshow at 262

>> figure,imhist(y) %原图直方图输出 >> z=histeq(y); %直方图均值化 >> figure,imshow(y) %显示源图像 Warning: Image is too big to fit on screen; displaying at 67%

>> figure,imshow(z) %变换后图像输出 Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262

>> figure,imhist(z) %变换后直方图输出

运行结果如下:

图 5-1 原图像直方图

图5-2 原图像输出

图5-3 直方图均值化后图像输出

图5-4 均值化处理后的直方图

3 空间域滤波

空间域滤波一般可以分为线性滤波和非线性滤波两类。根据功能又可以分为平滑滤波和锐化滤波平滑的目的可分为两类:一类是模糊,目的是在提取较大的目标前去除太小的细节或将目标内的小间断连接起来;另一类是消除噪声。锐化可以用高通滤波器实现,锐化的目的是增强被模糊的细节。

3.1 平滑滤波器

平滑滤波器,它能减弱或消除傅里叶空间的高频分量,但不影响低频分量,因为高频分量对应图像中的区域边缘等灰度值具有较大较快变化的部分,滤波器将这些分量滤去可使图像平滑。线性平滑滤波包括均值滤波和Wiener滤波,非线性平滑滤波包括最小值滤波,中值滤波和最大值滤波。

%均值滤波的实现

>> x=imread('chengzi.bmp'); >> I=rgb2gray(x); >> imshow(I)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262

>> K1=filter2(fspecial('average',3),I)/255; %3*3的均值滤波 >> K2=filter2(fspecial('average',5),I)/255; %5*5的均值滤波 >> K3=filter2(fspecial('average',7),I)/255; %7*7的均值滤波 >> figure,imshow(K2)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262 >> figure,imshow(K1)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262 >> figure,imshow(K3)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262

运行结果如下:

图6-1 原图像

图6-2 3*3均值滤波后图像

图 6-3 5*5均值滤波图像

图6-4 7*7均值滤波图像

%中值滤波

>> x=imread('chengzi.bmp'); >> I=rgb2gray(x); >> imshow(I)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262

>> K1=medfilt2(I,[3,3]); %进行3*3中值滤波 >> K2=medfilt2(I,[5,5]); %进行5*5中值滤波 >> K3=medfilt2(I,[7,7]); %进行7*7中值滤波 >> figure,imshow(K1)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262 >> figure,imshow(K2)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262 >> figure,imshow(K3)

Warning: Image is too big to fit on screen; displaying at 67% > In imuitools\\private\\initSize at 73 In imshow at 262

运行结果如下:

图7-1 原图像

图7-2 3*3中值滤波处理后图像

图7-3 5*5中值滤波处理后图像

图7-4 7*7中值滤波后图像

3.2 锐化滤波器

在图像识别中,需要有边缘鲜明的图像,即图像锐化。图像锐化的目的是为了突出图像的边缘信息,加强图像的轮廓特征,以便于人眼的观察和机器的识别。锐化滤波包括线性锐化和非线性锐化,利用拉普拉斯算子可实现线性锐化,非线性锐化可利用Sobel算子,Prewitt算子和高斯-拉普拉斯算子实现。下面利用拉普拉斯算子实现线性锐化,以观察锐化处理后的图像效果。

在Matlab中可通过调用filter2函数和fspecial函数来实现该变换。

%利用拉普拉斯算子实现图像的非线性锐化

>> x=imread('jiuping.bmp'); >> I=rgb2gray(x);

>> I=double(I); %将图像矩阵转化为double型 >> h1=fspecial('laplacian'); %拉式变换 >> J=filter2(h1,I); %滤波处理 >> figure,imshow(I,[]); %原图像输出

>> K=I-J; %增强图像为原图像减去拉式变换后的结果 >> figure,imshow(K,[]); %变换后图像输出

运行结果如下:

图8-1 原图像

图8-2 拉普拉斯算子处理后图像

用同样的方式可以利用Sobel算子,Prewitt算子和高斯-拉普拉斯算子实现非线性锐化滤波。

因篇幅问题不能全部显示,请点此查看更多更全内容