MatLab自学内容——矩阵,图像处理

来源:互联网 发布:nginx ssl 硬件加速卡 编辑:程序博客网 时间:2024/06/05 08:34

MATLAB之矩阵的基本运算

1.1 数值矩阵的生成

1.实数值矩阵输入

输入矩阵方法:用键盘上方括号“ [ ] ”代替矩阵括号。矩阵数据在方括号内按行输入,同一行相邻元素用空格(或逗号)隔开,相邻两行用分号“;”隔开。 例如:

>> A=[1 2 3 4;5,6,7,8;9 10 11 12]     %输出3行4列的矩阵A

A =

    2     3     4

    6     7     8

   10    11    12

2.复数矩阵输入

>> R=[1 2 3;4 5 6], M=[11 12 13;14 15 16]

R =

    2     3

    5     6

M =

11    12    13

14    15    16

>> CN=R+i*M

CN =

1.0000 +11.0000i   2.0000 +12.0000i   3.0000 +13.0000i

4.0000 +14.0000i   5.0000 +15.0000i   6.0000 +16.0000i

1.3  特殊矩阵的生成

命令  全零阵

函数  zeros

格式  B = zeros(n)      %生成n×n全零阵

B = zeros(m,n)          %生成m×n全零阵

B = zeros([m n])        %生成m×n全零阵

B = zeros(d1,d2,d3…)    %生成d1×d2×d3×…全零阵或数组

B = zeros([d1 d2 d3…])   %生成d1×d2×d3×…全零阵或数组

B = zeros(size(A))       %生成与矩阵A相同大小的全零阵

 

命令  单位阵

函数  eye

格式  Y  =  eye(n)    %生成n×n单位阵

 =  eye(m,n)        %生成m×n单位阵

 =  eye(size(A))     %生成与矩阵A相同大小的单位阵

 

命令  全1阵

函数  ones

格式  Y = ones(n)        %生成n×n全1阵

Y = ones(m,n)           %生成m×n全1阵

Y = ones([m n])          %生成m×n全1阵

Y = ones(d1,d2,d3…)      %生成d1×d2×d3×…全1阵或数组

Y = ones([d1 d2 d3…])     %生成d1×d2×d3×…全1阵或数组

Y = ones(size(A))         %生成与矩阵A相同大小的全1阵

重点掌握:

生成m阶单位方阵:eye(m)

生成m×n阶单位矩阵:eye(m,n)

生成m阶全1方阵:ones(m)

生成m×n阶全1矩阵:ones(m,n)

生成m阶全0方阵:zeros(m)

生成m×n阶全0矩阵:zeros(m,n)

>> clear

>> E=eye(2,3)      %生成2行3列的单位方阵

E =

    0     0

    1     0

>> B=ones(2,3)      %生成2行3列的全1矩阵

B =

    1     1

    1     1

1.4向量、矩阵的访问与赋值

更改、增加或删除向量的元素。 例如:

>> clear

>> x=[3 7 4 5]      %输出4维行向量x

x =

    7     4     5

>> x(3) = 2          %更改第三个元素

x =

    7     2     5

注:x(i)表示向量x的第i个分量。

>> x(6) = 10       %加入第六个元素(给第六个元素赋值)

x =

    7     2     5     0    10

>> x(4) = [ ]       %删除第四个元素

x =

    7     2     0    10

注:在对第六个元素进行赋值时,若未曾对第五个元素赋值,则默认为零。上述运算,结果均返回为变量x。

MATLAB亦可取出向量的一个元素或一部份来做运算。 例如:

>> clear

>> x=[1 2 3 4];y=[2 4 6 8 0];

>> x(2)*3+y(4)      %取出x的第二个元素和y的第四个元素来做运算

ans =

14

>> y(2:4)-1     %取出y的第二至第四个元素来做运算

ans =

    5     7

在上例中,2:4代表一个由2、3、4组成的向量,同样的方法可用于产生公差为1的等差数列,例如:

>> z = 7:16

z =

    8     9    10    11    12    13    14    15    16

若不希望公差为1,则可将所需公差直接至于4与13之间,例如:

>> w = 7:3:16    %公差为3的等差数列

w =

   10    13    16

同样地,我们可以对矩阵进行各种处理。 例如:

>> clear

>> A=sym([1 2 3 4;5 6 7 8;9 10 11 12])      %输出一个3行4列的矩阵

A =

 1,  2,  3,  4]

 5,  6,  7,  8]

 9, 10,  11, 12]

>> A(2,3) = 5      %改变第二列,第三行的元素值

A =

 1,  2,  3,  4]

 5,  6,  5,  8]

 9, 10, 11, 12]

注:A(i,j)表示矩阵A的(I,j)元,括号中,逗号前面表示行,后面表示列

>> A(2,:)           %第2行的所有元素

ans =

[ 5, 6, 5, 8]

>> B = A(2,1:3)      %取出部份矩阵B

B =

[ 5, 6, 5]

>> A = [A B']        %将B转置后以列向量并入A

A =

 1,  2,  3,  4,  5]

 5,  6,  5,  8,  6]

 9, 10, 11, 12,  5]

注:矩阵合并,若按照行的形式合并,则用;隔开;若按列的形式合并,则用空格或逗号隔开,例如:

>> A(:, 2) = [ ]      %删除第二列(:代表所有行)

A =

 1,  3,  4,  5]

 5,  5,  8,  6]

 9, 11, 12,   5]

>> A = [A; 4 3 2 1]      %加入第四行

A =

 1,  3,  4,  5]

 5,  5,  8,  6]

 9, 11,  12,  5]

 4,  3,  2,  1]

注:A是以一维数组的形式存取的,故默认最后一行。

>> C=[ 6, 7, 8, 9]

C =

    7     8     9

>> D=[5, 5;6, 6;7, 7;8, 8;]

D =

    5

    6

    7

    8

>> E=[D(:,1),C',D(:,2)]     %D第1列和第2列之间插入列向量C

E =

    6     5

    7     6

    8     7

    9     8

>> A([1 4], :) = [ ]     %删除第一和第四行(:代表所有列)

A =

 5,  5,  8,  6]

 9, 11, 12,  5]


x(i)
 向量x的第i各分量
 A(i)
 矩阵A作为一维数组的第i各元素
 
A(i,j)
 矩阵A的(i,j)元
 A(:)
 矩阵A以一维数组的形式输出
 
A(i,:)
 矩阵A的第i行
 A(i:j,:)
 矩阵A的第i行到第j行元素组成的子矩阵
 
A(:,j)
 矩阵A的第j列
 

 矩阵运算

2.1  加、减运算

运算符:“+”和“-”分别为加、减运算符。

运算规则:对应元素相加、减, 即按线性代数中矩阵的“十”, “一”运算进行。

矩阵的加法:A+B

矩阵的减法:A-B

>>A=[1, 1, 1; 1, 2, 3; 1, 3, 6]

>>B=[8, 1, 6; 3, 5, 7; 4, 9, 2]

 

Z=A+B

Z=A-B

 

结果显示:A+B=

  2   7

  7  10

 12   8

A-B=

-7    0   -5

-2    -3   -4

-3    -6    4

注意:矩阵加法与减法运算时,参加运算的矩阵必须是同型矩阵,其运算规则是对应元素的加减运算;

 

2.2  乘法

运算符:*

运算规则:按线性代数中矩阵乘法运算进行, 即放在前面的矩阵的各行元素, 分别与放在后面的矩阵的各列元素对应相乘并相加。

1.矩阵的乘法:两个矩阵相乘A*B

>>X= [2  3  4  5;

 2  2  1]

>>Y=[0  1  1;

 1  0;

 0  1;

 0  0]

Z=X*Y

结果显示为:

Z=

 5  6

 3  3

注意:矩阵A,B相乘,必须满足A的列数等于B的行数;

2.矩阵的数乘:数乘矩阵k*A

上例中:a=2*X

则显示:a =

 6  8  10

 4  4  2

向量的点乘(内积):维数相同的两个向量的点乘。

数组乘法:

A.*B表示A与B对应元素相乘。

3.向量点积

函数  dot

格式  C = dot(A,B)       %若A、B为向量, 则返回向量A与B的点积, A与B长度相同; 若为矩阵, 则A与B有相同的维数。

C = dot(A,B,dim)          %在dim维数中给出A与B的点积

例       >>X=[-1  0  2]

>>Y=[-2  -1  1]

>>Z=dot(X, Y)

则显示:Z =

4.向量叉乘

在数学上, 两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中, 用函数cross实现。

函数  cross

格式  C = cross(A,B)   %若A、B为向量, 则返回A与B的叉乘, 即C=A×B, A、B必须是3个元素的向量; 若A、B为矩阵, 则返回一个3×n矩阵, 其中的列是A与B对应列的叉积, A、B都是3×n矩阵。

C = cross(A,B,dim)   %在dim维数中给出向量A与B的叉积。A和B必须具有相同的维数, size(A,dim)和size(B,dim)必须是3。

计算垂直于向量(1, 2, 3)和(4, 5, 6)的向量。

>>a=[1  2  3];

>>b=[4  5  6];

>>c=cross(a,b)

结果显示:

c=

-3     6    -3

可得垂直于向量(1, 2, 3)和(4, 5, 6)的向量为±(-3, 6, -3)

2.3  除法运算

Matlab提供了两种除法运算:左除(\)和右除(/)。一般情况下, x=a\b是方程a*x =b的解, 而x=b/a是方程x*a=b的解。

例:a=[1  2  3; 4  2  6; 7  4  9]

b=[4; 1; 2]

x=a\b

则显示:x=

-1.5000

2.0000

0.5000

如果a为非奇异矩阵, 则a\b和b/a可通过a的逆矩阵与b阵得到:

z = inv(a)*b

b/a = b*inv(a)

数组除法:

A./B表示A中元素与B中元素对应相除。

2.4  矩阵乘方

运算符:^  矩阵的幂: A^m

运算规则:

当A为方阵, P为大于0的整数时, A^P表示A的P次方, 即A自乘P次; P为小于0的整数时, A^P表示A-1的P次方。

2.5  矩阵转置(A’)

运算符:′

运算规则:若矩阵A的元素为实数, 则与线性代数中矩阵的转置相同。

若A为复数矩阵, 则A转置后的元素由A对应元素的共轭复数构成。

若仅希望转置, 则用如下命令:A.′。

2.6  方阵的行列式

函数  det

格式  d = det(X)    %返回方阵X的多项式的值

例1-42

>> A=[1 2 3;4 5 6;7 8 9]

A =

    2     3

    5     6

    8     9

>> D=det(A)

D =

0

注意:在方阵的前提下,才可以作行列式运算。

2.7  逆

命令  逆

函数  inv

格式  Y=inv(X)   %求方阵X的逆矩阵。若X为奇异阵或近似奇异阵, 将给出警告信息。

矩阵的逆:A^-1或 inv(A)  (A*在M-book里完成)

例求 的逆矩阵

方法一

>>A=[1  2  3; 2  2  1; 3  4  3];

>>Y=inv(A)或Y=A^(-1)

则结果显示为

Y =

1.0000    3.0000   -2.0000

-1.5000   -3.0000    2.5000

1.0000    1.0000   -1.0000

方法二:由增广矩阵 进行初等行变换

>>B=[1, 2, 3, 1, 0, 0; 2, 2, 1, 0, 1, 0; 3, 4, 3, 0, 0, 1]

>>C=rref(B)     %化行最简形

>>X=C(:, 4:6)    %取矩阵C中的A^(-1)部分

显示结果如下:

C =

1.0000         0         0    1.0000    3.0000   -2.0000

   1.0000         0   -1.5000   -3.0000    2.5000

        0    1.0000    1.0000    1.0000   -1.0000

X =

1.0000    3.0000   -2.0000

-1.5000   -3.0000    2.5000

1.0000    1.0000   -1.0000

例1-44

>> A=[2 1 -1;2 1 2;1 -1 1];

>> format rat    %用有理格式输出

>> D=inv(A)

D =

1/3           0           1/3

          1/3         -2/3

-1/3          1/3           0

注意:在方阵的前提下,才可以作逆运算。

2.8  矩阵的迹

函数  trace

格式  b=trace (A)   %返回矩阵A的迹, 即A的对角线元素之和。

2.9  特殊运算

生成矩阵的行数与列数:size( )  结果是一个2维数组,第一个表示行数,第二个表示列数

生成对角矩阵:diag(a)  a是主对角线上元素所组成的向量

生成矩阵的对角元素:diag(A)    A是矩阵

生成上三角矩阵:triu(A)   A是矩阵

生成下三角矩阵:tril(A)    A是矩阵

例如:

>> clear

>> syms a b c d e f g h i

>> A=[a b c; d e f;g h i]     %输出符号矩阵A

A =

[ a, b, c]

[ d, e, f]

[ g, h, i]

>> size(A)        % A的行数与列数

ans =

    3

>> B=diag(A)     %矩阵A主对角线上的元素

B =

a

e

i

>> C=triu(A)      %生成上三角形矩阵

C =

[ a, b, c]

[ 0, e, f]

[ 0, 0, i]

 

 

【实验内容】

例3-1:输出矩阵 ,计算(1)A的转置;(2)A+2B;(3)6BA;(4) ;(5) ;(6) ;(7) 删除A第一行,将B的第二列的转置加到A的第一行于第二行中间.

相应的matlab代码及运算结果如下:

>>clear

>> A=[3 1 1;2 1 2;1 2 3]       %输出矩阵A

A =

    1     1

    1     2

    2     3

>> B=[1 1 -1;2 -1 0;1 0 1]      %输出矩阵B

B =

    1    -1

   -1     0

    0     1

>> A'      %A的转置

ans =

    2     1

    1     2

    2     3

>> A+2*B    %A+2B

ans =

    3    -1

   -1     2

    2     5

>> 6*B*A    %6BA

ans =

24     0     0

24     6     0

24    18    24

>> A^2     %A的平方

ans =

12     6     8

10     7    10

10     9    14

>> det(A)     %A的行列式

ans =

-4

>> inv(A)      %A的逆矩阵

ans =

0.2500    0.2500   -0.2500

1.0000   -2.0000    1.0000

-0.7500    1.2500   -0.2500

>> format rat

>> A^-1      %A的逆矩阵

ans =

1/4          1/4         -1/4

          -2            1

-3/4          5/4         -1/4

>> A(1,:)=[]      %删除A第一行

A =

    1     2

    2     3

>> B1=B(:,2)'     %取出B的第二列

B1 =

   -1     0

>> A=[A(1,:);B;A(2,:)]      %将B1加到A的第一行于第二行中间.

A =

    1     2

   -1     0

    2     3

例3-2:生成3×3单位矩阵,零矩阵,元素全为1的矩阵.

相应的matlab代码及运算结果如下:

>> eye(3)

ans =

    0     0

    1     0

    0     1

>> A=zeros(3)

A =

    0     0

    0     0

    0     0

>> B=ones(3)

B =

    1     1

    1     1

    1     1

=============================================================================

matlab中的size函数:

size:获取数组的行数和列数

(1)s=size(A),当只有一个输出参数时,返回一个行向量,该行向量的第一个元素时数组的行数,第二个元素是数组的列数。

(2)[r,c]=size(A),当有两个输出参数时,size函数将数组的行数返回到第一个输出变量,将数组的列数返回到第二个输出变量。

(3)如果在size函数的输入参数中再添加一项,并用1或2为该项赋值,则size将返回数组的行数或列数。其中r=size(A,1)该语句返回的时数组A的行数, c=size(A,2) 该语句返回的时数组A的列数。
=============================================================================
MATLAB支持的几种图像文件格式:

⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像专家组的图像压缩格式。

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

⑶PCX(Windows Paintbrush):可处理1位、4位、8位、16位、24位等图像数据。文件内容包括文件头、图像数据和扩展色图数据。

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

⑸PNG(Portable Network Graphics):包括1位、2位、4位、8位和16位灰度图像,8位和16位索引图像,24位和48位真彩色图像。

⑹GIF(Graphics Interchange Format):任何1位到8位的可交换的图像。

⑺HDF(Hierarchial Data Format):有8位、24位光栅图像数据集。

⑻ICO(Windows Icon resource):有1位、4位、8位非压缩图像。

⑼CUR(Windows Cursor resource):有1位、4位、8位非压缩图像。

⑽XWD(X Windows Dump):包括1位、8位Zpixmaps,XYBitmaps,XYPixmmmaps。

⑾RAS(Sun Raster image):有1位bitmap、8位索引、24位真彩色和带有透明度的32位真彩色。

⑿PBM(Portable Bitmap)。

⒀PGM(Portable Graymap)。

⒁PPM(Portable Pixmap)。

2.MATLAB支持五种图像类型,即二值图像、索引图像、灰度图像、RGB图像和多帧图像阵列。

图像类型: Double数据、uint8和uint16数据


二值图像:
 图像为m×n的整数矩阵,元素值范围[0,1]


 图像为m×n的整数矩阵,元素值范围[0,1]


索引图像:


 图像为m×n的整数矩阵,元素值范围[0,p]


 图像为m×n的整数矩阵,元素值范围[0,p-1]


灰度图像:


 图像为m×n的浮点数矩阵,元素值范围[0,1]


 图像为m×n的整数矩阵,元素值范围[0,255]或[0,65535]


RGB图像:


 图像为m×n×3的浮点数矩阵,元素值范围[0,1]


 图像为m×n×3的整数矩阵,元素值范围[0,255]或[0,65535]

 

其中,多帧图像阵列是由多帧图像组成的,每一帧图像可以为前四种图像中的一种,但组成一个多帧图像阵列的图像必须为同一种。cat函数可以将具有相同尺寸的几个独立图像存成多帧文件。对于多帧图像也可以从中提取单帧。


2.2.2 图像类型判断及转换


1.在MATLAB中如果要判断一个图像文件的类型,可使用如下指令:

        isbw:若图像为二值图像,则返回真。

        isgray:若图像为灰度图像,则返回真。

        isind:若图像为索引图像,则返回真。

        isrgb:若图像为RGB图像,则返回真。

2.在MATLAB系统中,要将一个类型的图像文件转换成另一个类型的图像文件,只需将前一个文件的图像数据用imread读出,再用imwrite以适当的格式写到后一个图像文件中去即可。另外,要将灰度图像I转换成RGB图像,可运用cat指令。cat函数可以把一些单一的图像合并成图像序列。在图像序列中每个图像需有相同的大小,如果是索引图像,色图也要一致。

此外,MATLAB还提供了若干函数,用于图像类型的转换。这些函数有:

        dither:用抖动法(dithering)转换图像。该函数通过颜色抖动(颜色抖动即改变边沿像素的颜色,使像素周围的颜色近似于原始图像的颜色,从而以空间分辨率来换取颜色分辨率)来增强输出图像的颜色分辨率。该函数可以把RGB图像转换成索引图像或把灰度图像转换成二值图像。

        gray2ind:灰度图像或二值图像向索引图像转换。

        grayslice:设定阈值将灰度图像转换为索引图像。

        im2bw:设定阈值将灰度、索引、RGB图像转换为二值图像。

        im2double:将图像数组转换为double型。

        im2uint8:将图像数组转换为uint8型。

        im2uint16:将图像数组转换为uint16型。该函数不支持二值图像序列的转换。

        ind2gray:索引图像向灰度图像转换。

        ind2rgb:索引图像向RGB图像转换。

        mat2gray:将一个数据矩阵转换为灰度图像。

        rgb2gray:RGB图像向灰度图像转换或将彩色色图转换成灰度色图。

        rgb2ind:RGB图像向索引图像转换。包含三种不同方法:均衡量化、最小值量化、色图映射。

        im2java:一般图像向Java图像转换。

        label2rgb:标志图像向RGB图像转换。


2.2.3 图像的查询及读写


在MATLAB中要查询一个图像文件的信息,只要用imfinfo指令加上文件及其完整路径名即可。函数调用格式为:

info = imfinfo(filename,fmt)

info = imfinfo(filename)

参数fmt对应于所有图像处理工具箱中所有支持的图像文件格式。


MATLAB提供了两个重要的用于图像文件的读写的指令,分别是从图像文件中读取数据的imread,以及将数据写入到图像文件中的imwrite。

1.imread的常见调用格式为:

A = imread(filename,fmt)

其作用是将文件名用字符串filename表示的,扩展名用fmt表示的图像文件中的数据读到矩阵A中。如果filename所指的为灰度级图像,则A为一个二维矩阵;如果filename所指的为RGB图像,则A为一个m×n×3的三维矩阵。Filename表示的文件名必须在MATLAB的搜索路径范围内,否则需指出其完整路径。

imread的其他几种重要的调用格式为:

[X,map] = imread(filename.fmt)

[…] = imread(filename)

[…] = imread(URL,…)

[…] = imread(…,idx)           (CUR,ICO and TIFF only)

[…] = imread(…,’frames’,idx)    (GIF only)

[…] = imread(…,ref)           (HDF only)

[…] = imread(…,’BackgroundColor’,BG)    (PNG only)

[A,map,alpha] = imread(…)      (ICO,CUR and PNG only)

上面一些参数的含义如下:idx是指读取图标(cur、ico、tiff)文件中第idx个图像,默认值为1。’frame’,idx是指读取gif文件中的图像帧,idx值可以是数量、向量或’all’。ref是指整数值。alpha是指透明度。

2.imwrite的常用调用格式为:

imwrite(A,filename,fmt)

imwrite(X,map,filename,fmt)

imwrite(…,filename)

imwrite(…,Param1,Val1,Param2,Val2…)

其中imwrite(…,Param1,Val1,Param2,Val2…)可以让用户控制HDF、JPEG、TIFF等一些图像文件格式的输出特性。

  在MATLAB中,默认的保存类型是uint8。由于PNG和TIFF格式支持16位的图像,所以保存这类图像时,保存类型就是uint16。

2.2.4 图像的显示
显示图像的最基本的手段是使用image函数。该函数还产生了图像对象的句柄,并允许对对象的属性进行设置。此外,imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色图的方式显示。

imshow函数比image和imagesc更常用,它能自动设置句柄图像的各种属性。imshow可用于显示各类图像。对于每类图像,调用方法如下:

        imshow filename:显示图像文件。

        imshow(BW):显示二值图像,BW为黑白二值图像矩阵。

        imshow(X,map):显示索引图像,X为索引图像矩阵,map为色彩图示。

        imshow(I):显示灰度图像,I为二值图像矩阵。

        imshow(RGB):显示RGB图像,RGB为RGB图像矩阵。

        imshow(I,[low high]):将非图像数据显示为图像,这需要考虑数据是否超出了所显示类型的最大允许范围,其中[low high]用于定义待显示数据的范围。

有关图像显示的函数或其辅助函数,除了上述的以外,MATLAB还提供了一些用于进行图像的特殊显示的函数。

        colorbar:为图像的显示增加一个颜色条,这一用法对于了解被显示图像的灰度级别特别有用。

        getimage:获取图像数据。

        immovie:将多帧索引图像制作成连续图像格式。其调用格式为:

mov = immovie(D,map)

不过这种功能只对索引图像有效,其中D为多帧索引图像阵列,map为索引图像的对应色阶。对于其他类型图像,则需要首先将其转换为索引图像。

        montage:多帧图像的一次显示。它能将每一帧分别显示在一幅图像的不同区域,所有子区的图像都用同一个色彩条。

        movie:播放多帧连续图像。

        subimage:在一个图形区域内显示多个图像。

        truesize:调整图像显示的尺寸。

        warp:显示图像的纹理表面图。前面提到的图像显示手段都只能在二维平面上显示,MATLAB6.5的一个强大功能是能将平面图像显示在空间三维曲面上。这是由warp函数的纹理成图功能来实现的,该功能能通过双线性插值将平面图像投影到三维曲面上。

        zoom:将图像或二维图形进行放大或缩小显示。zoom本身是是一个开关键,zoom on用于打开缩放模式,zoom off用于关闭该模式,zoom in用于放大局部图像,zoom out用于缩小图像。

至于多个图像的显示,则可分为两个方面:在不同的图形窗口显示不同的图像,可以用figure指令来实现;在同一个图形窗口显示多图,可以用subplot来实现。

第三章 图像运算
3.1 图像的点运算
点运算将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的值决定。它常用于改变图像的灰度范围及分布,是图像数字化及图像显示的重要工具。点运算因其作用性质,也被称为对比度增强、对比度拉伸或灰度变换。在真正进行图像处理之前,有时可以用点运算来克服图像数字化设备的局限性。

 

点运算实际上是灰度到灰度的映射过程。点运算不会改变图像内像素点之间的空间关系。设输入图像为A(x, y),输出图像为B(x, y),则点运算可表示为:

 

B(x, y) = f [A(x, y)]                (3-1)

点运算可完全由灰度变换(gray-scale transformation)函数s=f (r)决定,后者描述了输入灰度级与输出灰度级之间的映射关系。图像的点运算分为线性点运算和非线性点运算两种。


3.1.1 线性点运算
线性点运算是指灰度变换函数f为线性函数时的运算。

如图3.1,当a>1时,输出图像对比度增大;当a<1时,输出图像对比度降低;当a=1,b=0时,输出图像就是输入图像的简单复制;当a=1,b≠0时,仅使输出图像的灰度值上移或下移,其效果是使整个图像更亮或更暗。如果a为负值,暗区域将变亮,亮区域将变暗,点运算完成了图像求补。         


3.1.2 非线性点运算
非线性点运算对应于非线性映射函数,典型的映射包括平方函数、对数函数、截取函数(窗口函数)、域值函数、多值量化函数等。

阈值化处理是最常用的一种非线性点运算,它的功能是选择一阈值,将图像二值化,然后使用生成的二进制图像进行图像分割及边缘跟踪等处理。

直方图均衡化也是一种非常常用的非线性点运算。它是指将一个已知灰度分布的图像使用某种非线性灰度变换函数进行计算,使运算结果变成一幅具有均匀灰度分布的新图像。经过直方图均衡化的点运算处理后,实际的直方图将呈现参差不齐的外形,这是由于灰度级的可能个数是限造成的。在一些灰度级处可能没有像素,在另外一些灰度级处则像素很拥挤。


点运算的MATLAB实现:

I=imread('rice.png');

rice=double(I);

rice2=rice*0.5+50;

J=uint8(rice2);

subplot(1,2,1),imshow(I);

subplot(1,2,2),imshow(J);

原创粉丝点击