Matlab语言 数字图象基本操作 个人总结

本文详细介绍使用Matlab进行图像处理的方法,包括图像读取、矩阵操作、图像显示及傅立叶变换等内容。同时介绍了如何利用Matlab进行图像遍历读取、图像运算以及低通滤波器的设计。

遍历文件夹读取图像

cd ('D:\picture\test');
files=dir('*.jpg');
m=size(files,1);
G=zeros(256,256,m);
for i=1:m
G(:,:,i)=imread(files(i).name);
end
(前提是你所有的图像都是灰度的,256x256大小)

另外,matlabn的dir函数中读取的只是当前文件夹下的所有文件(夹),不能取到子文件夹下的文件(夹)


图像运算

   在实际的对图像处理过程中,由于我们读出的图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此读出的图像数据不能直接进行相加求平均,因此必须使用一个函数将图像数据转换成双精度型数据。

     double函数只是将读入图像的uint8数据转换为double类型,一般不使用,常用的是im2double函数,将uint8图像转为double类型,范围为0-1,如果是255的图像,那么255转为1,0还是0,中间的做相应改变。

     mat2gray是将最终获得的矩阵转化为灰度图像。常用的为
     A = im2uint8(mat2gray(result))
     这样就将result矩阵转化为uint8类型的图像。

 

   im2double函数,其语法格式为:
   I2 im2double(I1)

   其中I1是输入的图像数据,它可能是unit8或unit16型数据,通过函数的变化输出I2为一个double型数据,这样两图像数据就可以方便的进行相加等代数运算.

例如:

 
>> A = randint(5, 5, [0 255])
A =
   208    24    40    36   167
   231    71   248   107     9
    32   140   245   234   217
   233   245   124   202   239
   161   247   204   245   173
>> mat2gray(A)
ans =
    0.8326    0.0628    0.1297    0.1130    0.6611
    0.9289    0.2594    1.0000    0.4100         0
    0.0962    0.5481    0.9874    0.9414    0.8703
    0.9372    0.9874    0.4812    0.8075    0.9623
    0.6360    0.9958    0.8159    0.9874    0.6862
>> im2double(A)
ans =
   208    24    40    36   167
   231    71   248   107     9
    32   140   245   234   217
   233   245   124   202   239
   161   247   204   245   173



   要把double的图像(范围是0到1)再次转化为256灰度值的,可以这样

   Igrey= uint8(I2*255)

 

对图像进行点对点操作:)

    图像是图像,图像毕竟不是矩阵,要将两个图像相加或者把一些点排除掉,最好的办法就是对每个像素的操作。

    尤其要说明的是先要化作double型再操作,命令是".*"且别与"*"

 

    MATLAB的长处就是处理矩阵运算,因此用MATLAB处理数字图像非常的方便。


以下主要介绍一下如何读取矩阵的指定行或指定列,举例说明:
x=4:6 %产生一个一维数组,范围从4到6,步长为1
=
   4   5   6
插入:通过对x进行插入运算创建矩阵A
>> A=[x-3;x;x+3]  %当然也可以用别的方法产生A矩阵此处只作为示例
=
   1   2   3
   4   5   6
   7   8   9
提取:提取A的前两行和后两列形成矩阵C。
>> C=A(1:2,2:3)
=
   2   3
   5   6
置零:将矩阵A 的第二行第二列的元素置零
>> A(2,2)=0
=
   1   2   3
   4   0   6
   7   8   9
将矩阵A的第一列全置1
A(:,1)=1
=
   1   2   3
   1   0   6
   1   8   9
强调一下矩阵的乘法与矩阵的点乘的不同,举例说明:
A=eye(2)  %产生二维单位矩阵
=
   1   0
   0   1
>> B=[1,2;3,4]  %直接法输入矩阵
=
   1   2
   3   4
>> A+B %求A与B的和(符合矩阵求和原则)
ans =
   2   2
   3   5
>> A.*B %求A与B的点积(即两矩阵中对应元素分别相乘
ans =
   1   0
   0   4
>> A*B %求A与B的乘积(符合矩阵乘积原则A的列数与B的行数相等)
ans =
   1   2
     3   4
注意:请大家在E盘建一个目录(imp),在每次启动时都要将这个目录加入到MATLAB的搜索路径中,添加的方法为File----Set Path----Tool---Add Path

 

 

MATLAB中图象数据的读取
A、 imread
    imread函数用于读入各种图象文件,其一般的用法为
           [X,MAP]=imread(‘filename’,‘fmt’)
其中,X,MAP分别为读出的图象数据和颜色表数据,fmt为图象的格式,filename为读取的图象文件(可以加上文件的路径)。
例:[X,MAP]=imread(’flowers.tif’,’tif’);
B、 imwrite
imwrite函数用于输出图象,其语法格式为:
imwrite(X,map,filename,fmt)按照fmt指定的格式将图象数据矩阵X和调色板map写入文件filename。
C、 imfinfo
imfinfo函数用于读取图象文件的有关信息,其语法格式为
imfinfo(filename,fmt)
imfinfo函数返回一个结构info,它反映了该图象的各方面信息,其主要数据包括:文件名(路径)、文件格式、文件格式版本号、文件的修改时间、文件的大小、文件的长度、文件的宽度、每个像素的位数、图象的类型等。
例:
imfinfo('rice.tif')
ans =
           Filename: 'C:\MATLAB6p5\toolbox\images\imdemos\rice.tif'
         FileModDate: '26-Oct-1996 06:11:58'
          FileSize: 65966
            Format: 'tif'
        FormatVersion: []
            Width: 256
            Height: 256
           BitDepth: 8
          ColorType: 'grayscale'
       FormatSignature: [73 73 42 0]
          ByteOrder: 'little-endian'
        NewSubfileType: 0
        BitsPerSample: 8
         Compression: 'Uncompressed'
  PhotometricInterpretation: 'BlackIsZero'
         StripOffsets: [8x1 double]
       SamplesPerPixel: 1
         RowsPerStrip: 32
       StripByteCounts: [8x1 double]
         XResolution: 72
         YResolution: 72
        ResolutionUnit: 'Inch'
           Colormap: []
     PlanarConfiguration: 'Chunky'
          TileWidth: []
          TileLength: []
         TileOffsets: []
        TileByteCounts: []
         Orientation: 1
          FillOrder: 1
      GrayResponseUnit: 0.0100
        MaxSamplev alue: 255
        MinSamplev alue: 0
         Thresholding: 1
ImageDescription: [1x166 char]
 

 

MATLAB中图象文件的显示
imshow
imshow函数是最常用的显示各种图象的函数,其语法如下:
imshow(X,map)
其中X是图象数据矩阵,map是其对应的颜色矩阵,若进行图象处理后不知道图象数据的值域可以用[]代替map。
需要显示多幅图象时,可以使用figure语句,它的功能就是重新打开一个图象显示窗口。
例:
I=imread(‘rice.tif’);
Imshow(I);
J=imread(‘flowers.tif’);
figure,imshow(J);


转自 http://blog.sina.com.cn/s/blog_4190406301008z5t.html


掌握应用MATLAB语言进行FFT及逆变换的方法


傅立叶变换的基本知识
    在图象处理的广泛应用领域中,傅立叶变换起着非常重要的作用,具体表现在包括图象分析、图象增

强及图象压缩等方面。
    假设f(x,y)是一个离散空间中的二维函数,则该函数的二维傅立叶变换的定义如下:
 u=0,1…M-1 v=0,1…N-1 (1)
   离散傅立叶反变换的定义如下:
          x=0,1…M-1 y=0,1…N-1(3)
   F(p,q)称为f(m,n)的离散傅立叶变换系数。这个式子表明,函数f(m,n)可以用无数个不同频率

的复指数信号和表示,而在频率(w1,w2)处的复指数信号的幅度和相位是F(w1,w2)。
例如,函数f(m,n)在一个矩形区域内函数值为1,而在其他区域为0.
假设f(m,n)为一个连续函数,则f(m,n)的傅立叶变换的幅度值(即)显示为网格图。
将傅立叶变换的结果进行可视化的另一种方法是用图象的方式显示变换结果的对数幅值。


MATLAB提供的快速傅立叶变换函数
(1)fft2
fft2函数用于计算二维快速傅立叶变换,其语法格式为:
B = fft2(I)
B = fft2(I)返回图象I的二维fft变换矩阵,输入图象I和输出图象B大小相同。
例如,计算图象的二维傅立叶变换,并显示其幅值的结果,其命令格式如下
load imdemos saturn2
imshow(saturn2)
B = fftshift(fft2(saturn2));
imshow(log(abs(B)),[],'notruesize')
(2)fftshift
MATLAB提供的fftshift函数用于将变换后的图象频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
  B = fftshift(I)
对于矩阵I,B = fftshift(I)将I的一、三象限和二、四象限进行互换。
(2)ifft2
ifft2函数用于计算图象的二维傅立叶反变换,其语法格式为:
B = ifft2(I)
B = ifft2(A)返回图象I的二维傅立叶反变换矩阵,输入图象I和输出图象B大小相同。其语法格式含义与

fft2函数的语法格式相同,可以参考fft2函数的说明。


简单低通滤波器的设计
    一个图象经过傅立叶变换后,就从空域变到了频域,因此我们可以用信号处理中对于频域信号的处理

方法对一幅图象进行处理。比如对图象进行低通滤波等。
    虽然在计算机中必定能够模拟一个锐截止频率的理想低通滤波器,但它们不能用电子元件来实现。实

际中比较常用的低通滤波器有:巴特沃思(Butterworth)滤波器、指数滤波器(ELPF)、梯形低通滤波

器等。
    在实验中我们设计一个理想的低通滤波器。
    设计理想的低通滤波器由其定义可知只要设计一个与频域图象大小完全相同的矩阵。在某一个域值内

该矩阵的值为1,其余为0即可。
例:若图象的大小为128*128,则可以这样设计一个低通滤波器:
H=zeros(128);
H(32:96,32:96)=1; %此处的范围是人为取定的,可以根据需要更改。
    若图象矩阵I的傅立叶变换是B(已经用fftshift将频谱中心移至矩阵的中心),则对这幅图象做低通滤

波,再做傅立叶逆变换命令为
LOWPASS=B.*H;  %此处设变换后的矩阵为LOWPASS,另注意这儿是矩阵的点乘。
C=ifft2(LOWPASS);
Imshow(abs(C))


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值