zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于matlab的数字图像处理

MATLAB 基于 数字图像处理
2023-09-11 14:15:36 时间

MATLAB支持以下几种图像文件格式:

(1)PCX(Windows Paintbrush)格式。可处理1,4,8,16,24位等图像数据。文件内容包括:文件头(128字节),图像数据、扩展颜色映射表数据。

(2)BMP(Windows Bitmap)格式。有1,4,8,24位非压缩图像,8位RLE(Run-length Encoded )图像。文件内容包括:文件头(一个BITMAP FILEHEADER数据结构),位图信息数据块(位图信息头BITMAP INFOHEADER和一个颜色表)和图像数据。

(3)HDF(Hierarchical Data Format)格式。有8位,24位光栅数据集。

(4)JPEG(Joint Photographic Experts Group)格式,是一种成为联合图像专家组的图像压缩格式。

(5)TIFF(Tagged Image File Format)格式。处理1,4,8,24位非压缩图像,1,4,8,24位packbit压缩图像,一位CCITT压缩图像等。文件内容包括:文件头,参数指针表与参数域,参数数据表和图像数据四部分。

(6)XWD(X Windows Dump)格式。1,8位Zpixmaps,XYbitmaps,1位XYpixmaps。

(7)PNG(Portable Network Graphics)格式。

2.3.2 图像类型

MATLAB中,一幅图像可能包含一个数据矩阵,也可能包含一个颜色映射表矩阵。MATLAB中有四种基本的图像类型:

(1)索引图像

索引图像包括图像矩阵与颜色图数组,其中,颜色图是按图像中颜色值进行排序后的数组。对于每个像素,图像矩阵包含一个值,这个值就是颜色图中的索引。颜色图为m*3双精度值矩阵,各行分别指定红绿蓝(RGB)单色值。Colormap=[R,G, B],R,G,B为值域为[0,1]的实数值。

图像矩阵与颜色图的关系依赖于图像矩阵是双精度型还是uint8(无符号8位整型)类型。如果图像矩阵为双精度类型,第一点的值对应于颜色图的第一行,第二点对应于颜色图的第二行,依次类推。如果图像矩阵是uint8,有一个偏移量,第0点值对应于颜色图的第一行,第一点对应于第二行,依次类推;uint8长用于图形文件格式,它支持256色。

(2)灰度图像

在MATLAB中,灰度图像是保存在一个矩阵中的,矩阵中的每一个元素代表一个像素点。矩阵可以是双精度类型,其值域为[0,1];也可以为uint8类型,其数据范围为[0,255]。矩阵的每个元素代表不同的亮度或灰度级。

(3)二进制图像

二进制图像中,每个点为两离散值中的一个,这两个值代表开或关。二进制图像保存在一个由二维的由0(关)和1(开)组成的矩阵中。从另一个角度讲,二进制图像可以看成为一个仅包括黑与白的灰度图像,也可以看作只有两种颜色的索引图像。

二进制图像可以保存为双精度或uint8类型的双精度数组,显然使用uint8类型更节省空间。在图像处理工具箱中,任何一个返回二进制图像的函数都是以uint8类型逻辑数组来返回的。

(4)RGB图像

与索引图像一样,RGB图像分别用红,绿,蓝三个亮度值为一组,代表每个像素的颜色。与索引图像不同的是,这些亮度值直接存在图像数组中,而不是存放在颜色图中。图像数组为M*N*3,M,N表示图像像素的行列数。

 

图像增强是一类基本的图像处理技术,其目的是对图像进行加工,以得到对具体应用来说视觉效果更好、更有用的图像。这里的好和有用要因具体的应用目的和要求而异,并且所需的具体增强技术也可不同。

目前常用的增强技术根据其处理所进行的空间不同,可分为基于图像域的方法和基于变化域的方法。第一类,直接在图像所在的空间进行处理,也就是在像素组成的空间里直接对像素进行操作;第二类,在图像的变化域对图像进行间接处理。

空域增强方法可表示为:g(x,y)=EH[f(x,y)]

其中fxy)和gxy)分别为增强前后的图像,EH代表增强操作。

    在图4.1.1中可以看出,通过变换可以使原图的较高的和较低的灰度值的动态范围减小了,而原图在二者之间的动态范围增加了,从而其范围的对比度增加了。

MATLAB代码所示:

X1=imread('pout.tif');

figure,imshow(X1)

f0=0;g0=0;

f1=70;g1=30;

f2=180;g2=230;

f3=255;g3=255;

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(X1);

X2=double(X1);

for i=1:m

   for j=1:n

      f=X2(i,j);

      g(i,j)=0;

      if(f>=0)&(f<=f1)

      g(i,j)=r1*f+b1;

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

      g(i,j)=r2*f+b2;

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

      g(i,j)=r3*f+b3;

      end

   end

end

figure,imshow(mat2gray(g))

图像处理图示(如图4-2和图4-3)

 

图4-2  原图                        图4-3增强对比度所得图像

对图像求反是将原来的灰度值翻转,简单的说就是使黑变白,使白变黑。

    普通的黑白底片和照片就是这样的关系。具体的变换就是将图像中每个像素的灰度值根据变换曲线进行映射。

MATLAB代码所示:

X1=imread('pout.tif');

f1=200;

g1=256;

k=g1/f1;

[m,n]=size(X1);

X2=double(X1);

for i=1:m

  for j=1:n

     f=X2(i,j);

     g(i,j)=0;

     if(f>=0)&(f<=f1)

      g(i,j)=g1-k*f;

     else

      g(i,j)=0;

     end

   end

end

figure,imshow(mat2gray(g))

图像处理图如图4-4所示:

 

 

4.2 空域滤波增强

一般情况下,像素的邻域比该像素要大,也就是说这个像素的邻域中除了本身以外还包括其他像素。在这种情况下,g(x,y)在(x,y)位置处的值不仅取决于f(x,y)在以(x,y)为中心的邻域内所有的像素的值。如仍以s和t分别表示f(x,y)在(x,y)位置处的灰度值,并以n(s)代表f(x,y)在(x,y)邻域内像素的灰度值,则 t=EA[s,n(s)]

为在邻域内实现增强操作,常可利用模板与图像进行卷积。每个模板实际上是一个二维数组,其中各个元素的取值定了模板的功能,这种模板操作也称为空域滤波。

4.2.1 基本原理

空域滤波可分为线形滤波和非线形滤波两类。

线形滤波器的设计常基于对傅立叶变换的分析。

非线形空域滤波器则一般直接对邻域进行操作。

另外各种滤波器根据功能又主要分成平滑滤波和锐化滤波。平滑可用低通来实现,锐化可用高通来实现

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

锐化滤波器:它能减弱或消除傅立叶空间的高频分量

空域滤波器都是利用模板卷积,主要步骤如下:

(1)将模板在图中漫游,并将模板中心与图中某个像素位置重合;

(2)将模板上的系数与模板下对应的像素相乘;

(3)将所有的乘积相加;

(4)将和(模板的输出响应)赋给图中对应的模板中心位置像素。

下面分别介绍在MATLAB中如何应用平滑和锐化滤波器。

4.2.2 线性平滑滤波器

线性低通滤波器是最常用的线性平滑滤波器。这种滤波器的所有系数都是正的。对3*3的模板来说,最简单的操作是取所有系数都为1。为保证输出图像仍在原来的灰度范围内,在计算R后要将其除以9再进行赋值。这种方法称为邻域平均法。

MATLAB实现均值过滤器的代码所示:

I=imread('saturn.tif');

J=imnoise(I,'salt & pepper',0.02);

imshow(I)

figure,imshow(J)

K1=filter2(fspecial('average',3),J)/255;

figure,imshow(K1)

title('3*3的均值滤波器')

图4-4 图像求反后

 

原图像,加入椒盐噪声的图像和均值滤波的图像分别如图4-5、图4-6和图4-7所示

 

图4-5 原图                        图4-6加入椒盐噪声图像

 图4-7   3*3的均值滤波器处理结果

 

中值滤波器是最常用的非线性平滑滤波器。它是一种临域运算,类似于卷积,但计算的不是加权求和,而是把邻域中的像素按灰度级进行排序,然后选择改组的中间值作为输出的像素值。具体步骤:

(1)将模板在图像中漫游,并将模板中心和图像某个像素的位置重合;

(2)读取模板下对应像素的灰度值;

(3)将这些灰度值从小到大排成一列;

(4)找出这些值排在中间的一个;

(5)将这个中间值赋给对应模板中心位置的像素。

MATLAB实现中值滤波器代码所示:

I=imread('saturn.tif');

J=imnoise(I,'salt & pepper',0.02);

K1=medfilt2(J,[3,3]);

figure,imshow(K1)

中值滤波的结果如图4-8所示。

图4-8  中值滤波结果

 

线性高通滤波器是最常用的线性锐化滤波器。这种滤波器的中心系数都是正的,而周围的系数都是负的。对3*3的模板来说,典型的系数取值是:

[-1 –1 –1;-1  8 –1;-1 –1 -1]

事实上这是拉普拉斯算子,所有的系数之和为0。当这样的模板放在图像中灰度值是常数或变化很小的区域时,其输出为0或很小。这个滤波器将原来的图像中的零频域分量去除了,也就是将输出的图像的平均值变为0,这样就会有一部分像素的灰度值小于0。在图像处理中我们一般只考虑正的灰度值,所以还有将输出图像的灰度值范围通过尺度变回到所要求的范围。

MATLAB代码所示:

I=imread('saturn.tif');

m=fspecial('laplacian')

I1=filter2(m,I)

h=fspecial('unsharp',0.5);

I2=filter2(h,I)/255;

subplot(1,2,1);

imshow(I1);

title('高通滤波laplacian算子')

subplot(1,2,2);

imshow(I2);

title('高通滤波unsharp')

处理结果如图4-9所示

图4-9空域高通滤波