数字图像处理(冈萨雷斯版)学习笔记(1)第1-2章

第一章

1.MATLAB典型应用

  • 数学和算法

  • 算法开发

  • 数据获取

  • 建模、模拟和原型设计

  • 数据分析、研究和可视化

  • 科学和工程图形

  • 应用开发、包括图像用户面结构建


第二章

2.1 数字图像的表示

  • 图像可被定义为二维函数f(x,y),f在(x,y)处的振幅称为图像在该点的亮度。

  • 图像关于x和y坐标以及振幅连续,要将图像数字化,就要数字化坐标和振幅。坐标值数字化称为取样,将振幅数字化称为量化。因此,当x,y都是有限离散的量时,称该图像为数字图像

  • 灰度表示黑白图像的亮度。

  • 彩色图像由单个二维图像组合形成的。

2.1.1 坐标约定

  • 取样和量化的结果是一个实数矩阵

  • 工具箱中表示数组的坐标约定用(r,c)表示行与列,且原点在坐标(r,c)=(1,1)处,r是从1到M的整数,c是从1到N的整数。

  • IPT文档将这种坐标称为像素坐标。IPT还采用另一种使用较少的坐标,x为列,y为行。

2.1.2 图像的矩阵表示

  • 数字化图像函数的表示可以用矩阵来表示,矩阵中数组的每一个元素都称为像元、图元或像素。

  • 在MATLAB中,矩阵以变量的形式来储存,变量名必须以字母开头,且只能有字母、数字、下划线组成。用常见的罗马字母来表示数学表达式,如f(x,y)。


2.2 读取图像

  • 使用函数imread可以将图像读入MATLAB环境变量。 imread的语法为:imread(‘filename’) 其中filename是含有图像文件全名的字符串,若命令行未包含分号,则MATLAB会立即将显示运算结果。当filename不包含任何路径信息时,imread会从当前路径搜索并读取图像文件。也可以直接输入相对路径。例如:

    f = imread(’.\myimages\chestxray.jpg’);

  • size函数可给出一幅图像的行数(M)和列数(N)。

  • [M,N] = size(f)语句返回图像的行数(M)和列数(N).

  • whos函数可以返回一个数组的信息,例如:whos f。


2.3 显示图像

  • 在MATLANB桌面图像一般使用函数imshow来显示,该函数的基本语法为imshow(f , G)其中,f是一个图像数组,G是显示该图像的灰度级数(省略G,默认灰度级数是256)

  • imshow(f,[low , high])语法会将所有小于或等于low的值都显示为黑色,所有大于或等于high的值都显示为白色

  • imshow(f , [ ])语法可将变量low设置为数组f的最小值,将high设置为最大值。这一形式在显示一幅动态范围较小的图像或既有正值又有负值的图像是非常有用。

  • pixval函数经常用来交互式地显示单个像素的亮度值。该函数可以显示覆盖在图像上的光标。光标在图像上移动时,光标所在位置的坐标和该点的亮度值会在该图形窗口的下方显示出来。处理彩色图像时,红,绿,蓝分量的坐标也会显示出来。(补充说明:函数pixval(matlab7.8中此函数已过时),改用impixelinfo,用来测试像素的值。)

  • figure函数可以在imshow 函数显示一幅图像时,使MATLAB在屏幕上用新图像替换就图像。为保持第一幅图像并同时显示第二幅图像,可以使用以下语法:

    figure , imshow(g)

    imshow(f), figure, imshow(g)


2.4 保存图像

  • imwrite函数可以将图像写到磁盘上,语法为:
    imwrite(f, ‘filename’ )
    filename中所包含的字符串必须是一种可识别的文件格式的扩展名,例如:

    imwrite(f, ‘patient10_run1’, ‘tif’)
    imwrite(f, ‘patient10_run1.tif’ )

  • imwrite函数可以有其他的参数,具体取决于所选的文件的格式。

  • 一种常用但只适用于JPEG图像的函数是imwrite,其语法为:

    (f, ‘filename.jpg’, ‘quality’,q)
    q是0到100之间的整数

  • imfinfo函数用来获取图像所实现的压缩和图像的其它详细信息,其语法结构为:

    imfinfo filename 其中filename是存储在磁盘中的图像的全名。

2.5 数据类

  • MATLAB中的像素值本身并不是整数。MATLAB和IPT支持8种数值数据类字符类逻辑数据类

  • double类是图像处理应用中最常用的数据类,MATLAB中的所有数值都可由它计算。


2.6 图像类型

工具箱支持的图像类型:

  • 亮度图像(Intensity images)

  • 二值图像(Binary images)

  • 索引图象(Indexed images)

  • RGB图像(RGB images)

大多数单色图像的处理运算是通过二值图像或亮度图像来进行的。

2.6.1 亮度图像

  • 一幅亮度图像是一个数据矩阵,其归一化的取值表示亮度。若亮度图像都是uint8类或uint16类,则它们的整数值范围分别是[0,255]和[0,65535]。若图像是double,则像素的取值就是浮点数。规定双精度型归一化亮度的取值范围是[0,1]。

2.6.2 二值图像

  • 一幅二值图像是一个取值只有0和1的逻辑数组。例如:一个取值只包含0和1的uint8类数组,在MATLAB中并不认为是二值图像。因此,一个由0和1构成的数值数组A,可以转化为逻辑数组B:

    B=logical(A)

  • 若A中除了0和1之外还有其它元素,使用logical函数就可以将所有非零的量转变为逻辑1,所有的0值转换为逻辑0。

  • 要测试一个数组是否为逻辑数组,可以使用函数i是logical:

    islogical©
    若c是逻辑数组,则该函数返回1;否则返回0。

2.6.3 术语注释

一幅图像的特性是由数据类图像类型这两者来表征的。例如,“uint8亮度图像”表示一幅像素都是uint8数据类的亮度图像。工具箱中的有些函数支持所有的数据类,而有些函数只支持特殊的数据类。例如,二值图像中的像素只能是logical数据类。

2.7 数据类与图像类型间的转换

记住表2.2中的每种数据类型的取值范围!!!

2.7.1

  • 数据类间的转换直截了当。通用语法为:
    B = data_class_name(A)

  • data_class_name可以是表2.2中第一列的任何一项。例如,假设A是一个uint8类数组,则命令B=double(A)会产生一个双精度浮点数组B。这种转换贯穿全书,因为MATLAB希望数值计算中的所有操作数都是双精度浮点数。假设c是一个取值范围为[0,255](很有可能包含小数)的double类数组,则命令D=uint8©可将其转化为一个uint8类数组。

  • 若一个double类数组包含有区间[0,255]之外的值,则在使用上述方法将其转换成uint8类数组时,MATLAB会将所有小于0的值转换为0,所有大于255的值转换为255,而在0和255之间的值将全部舍去小数点部分转换为整数。因此,在将double类数组转换成uint8类数组之前,有必要对其适当的缩放,以使其元素的取值尽量在区间[0,255]内。

2.7.2 图像类和类型间的转换

  1. 工具箱中提供了执行必要缩放的函数,以在图像类和类型间进行转换。函数im2uint8可以检测输入的数据类,并进行所有必要的缩放,使工具箱能够将这些数据识别为有效的图像数据。例如:

     f =
     	-0.5 0.5
         0.75 1.5
    

    执行转换

     >> q = im2uint8(f)
    

    得到结果

     q = 
          0   128
        191   255
    

    对于其它函数同样适用,例如:

     >> q = im2int16(f)
    

    得到结果:

     q =  
     	0  32768
     49151  65535
    

    可以看出,函数imuint8将输入中所有小于0的值设置为0,将输入中所有大于1的值设置为255,再将所有的其它值乘以255,并将得到的结果四舍五入为最接近的整数,完成了转换(imuint8与数据类型转换函数uint8是不一样的,后者只是简单的将小数部分去掉了。

  • 要把一个double类的任意数组转换为[0,1]的归一化double类数组,可以通过函数mat2gray完成基本语法为:

    g = mat2gray(A, [Amin,Amax])

    其中,图像g的取值范围在0(黑色)到1(白色)之间。规定参数Amin和Amax,是为了在转换时将A中小于Amin的值在g中转换为0,将A中大于Amax的值在g中转换为1。语句:

      >> g = mat2gray(A)
    

    将矩阵A中实际的最小值和最大值分别赋给Amin和Amax。假设输入是double类,则输出也是double类。

      >> A =
      		1.2000 2.3000
      		3.1000 5.2000
    

    转换得

      g = 
      		0  	0.2750
      	0.4750	1.0000
    

    若输入的矩阵的每一个数的值都相等,转换为[0 , 1]的归一化double类数组是什么样的呢?例如:

      B =
      	2.1000	2.1000
      	2.1000	2.1000
    

    执行转换

      >> g = mat2gray(B)
    

    结果为:

      g = 
      	1	1
      	1	1
    

    所以,当矩阵数值相等时,归一化数组的数值都为1。

  • 函数im2double将输入转换为double类。若输入uint8类,uint16类或logical类,则函数im2double将其转为范围[0 , 1]间的double类。若输入已经时double类,则函数imdouble将返回一个与输入值相等的数组。例如:若计算过程中产生了一个取值范围超出了[0 , 1]的double类数组,则将该矩阵输入到函数im2double中不会产生任何效果,正如前段所提到的那样,使用函数mat2gray,可将有着任意值的double类数组转换成取值范围为[0 , 1]的double类数组。例如:一幅uint8类图像

      >> h = uint8([25 50; 128 200]);
    

    执行转换

      >> g = im2double(h);
    

    得到结果

      >> g = 
      		0.0980	0.1961
      		0.4706	0.7843
    

    从中可以看出,当输入为uint8类数据时,转换只是简单地将输入数组的每个值都除以255,同样地,输入为uint16类数组,则输入数组的每个值都除以65535。

  • 二值图像和亮度图像类型间的转换:函数im2bw的语法为

    g = im2bw(f, T)

    该函数通过阈值处理,将一幅亮度图像f转换为一幅二值图像g。输出二值图像g中值为0的像素点,对应与输入亮度图像f中值小于阈值T的像素点,输出二值图像g中值为0的像素点,对应于输入来亮度图像f中的其他像素点。不管输入是何种数据类,T的取值都必须都在区间[0 ,1]内。im2bw自动将输出二值图像声明为一个logical数组。若我们写为g = im2bw(f),则IPT会为T使用默认值0.5。若输入是一幅uint8类图像,则im2bw会将该图像的所有像素点除以255,然后使用默认的阈值或给定的阈值。若输入的是一幅uint16类图像,则除以65535。若输入的是一幅double类图像,则im2bw会直接使用默认的阈值或给定的阈值。若输入的是一的logical数组,则输出与输入相同。使用特定的函数都可以将一个逻辑(二值)数组转换为一个数值数组。
    例如:将double类图像

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

    转换为一幅这样的二值图像,即原图像中的1和2变为0,其余两个值变为1。首先将原图像的取值范围变换为区间[0 , 1]:

      >> g =mat2gray(f)
      g = 
      	0	0.3333
      0.6667	1.0000
    

    然后,使用阈值0.6将其转换为二值图像:

      >> gb = im2bw(g, 0.6)
      gb = 
      	0	0
      	1	1
    

    利用关系运算符直接生成一个二维数组:

      >> gb = f > 2
      gb = 
      	0	0
      	1	1
    

    我们可以使用函数islogical将gb是一个逻辑数组的事实存储为一个变量

      >> gbv = islogical(gb)
      gbv = 
      	1
    

    将gb转换为一个值为0和1的double类数值数组。实现的方法如下:

      >> gbd = im2double(gb)
      gbd = 
      	0	0
      	1	1
    

    若gb是一个uint8类数值数组,则对其使用im2double可以得到取值为

        	 0 		 0
      0.0039  0.0039
    

    的数组,因为函数imb2double会将所有元素都除以255。在这之前的转换中都没有出现过,因为那时函数imbdouble检测到输入是一个值只能为0和1的逻辑数组。若输入是一个uint8类数值数组,则在保持其值为0和1的前提下要将它转换为double类数组,可以使用如下语句完成:

      >> gbd = double(gb)
      gbd = 
      	0	0
      	1	1
    

    MATLAB支持嵌套语句
    因此,上述转换可以只用单行语句

      >> gbd = im2double(im2bw(mat2gray(f), 0.6));
    

    来完成,整个过程也可以用一条更简单的命令实现:

      >> gbd = double(f>2)
    

你可能感兴趣的:(数字图像处理)