数字图像处理笔记
MATLAB入门
1 基本数值运算
- MATLAB中的变量必须字母开头,且只能由字母、数字和下划线组成。
- 变量区分大小写
2 MATLAB矩阵结构
2.1 创建矩阵
矩阵是MATLAB运算的基础。必须要县确定类型,创建矩阵。
创建方法
- 直接输入矩阵元素
- 调用矩阵创建函数
2.2 向量、标量、空矩阵
- 向量:行数或列数为1的特殊矩阵
例创建10-1的递减向量数列(10:-1:1) - 标量:行列数都为1的特殊矩阵。任意以矩阵表示单个实数或复数
- 空矩阵:至少一维的数值为0的矩阵;
不是全0的矩阵
例:a=[] 用whos查看其名称、大小、数据类型。
2.3 矩阵寻访
元素下标:MATLAB中的下标都是从1开始的。
矩阵的下标表示与常用的数学习惯相同,使用”双下标“(row,column),分别表示行和列的索引。
例:创建矩阵A
1 | A=[1,2,3;4,5,6] |
则
1 | A(2,2) ans = 5 |
用冒号(:)表示矩阵的多个元素。表示等差步进,从而帮助生成向量矩阵。
例:在上述矩阵A中。
A(i:i+j,n)表示第n列的i~i+j个元素
A(m,:)表示M行中的所有元素
1 | A(1:2,2) |
ans=
1 | 2 |
1 | A(2,1:3) |
ans=
1 | 4 5 6 |
2.4 获取矩阵存储信息
如下表所示:
| 函数 | 功能 |
|---|---|
| length | 矩阵的最长维长度 |
| ndims | 矩阵的维度 |
| numel | 矩阵的元素个数 |
| size | 矩阵指定维的长度 |
3 MATLAB数组
3.1 数组索引
向量的元素可以使用单一的索引值(下标)来访问。
[]来定义数组或者矩阵,用()来引用其中的元素。
可以用一个向量作为另一个向量的索引。
例:
v([1 4 5])表示数组v的第1、4、5个元素
3.2 单元数组
- 单元数组提供了在一个变量名下组合一组对象(如:数字、字符、其他单元矩阵)的方法。
- 用name{}查看单位数组元素,name()查看其描述。
4 函数句柄
M文件是MATLAB脚本。
4.1 两种类型
- 命名函数句柄:@+函数名称如f=@sin
- 匿名函数句柄:由@+MATLAB表达式形成。
M文件由以下部分组成:函数定义行、H1行、帮助文本、函数体、注释。
5 MATLAB运算符
5.1 算数运算符
- 矩阵算数运算符—-按线性代数的规则定义
- 数组运算符—-逐个元素地执行,且可以用于多维数组。
tip
使用 “.” 来区分数组运算和矩阵运算。
A*B —-表示矩阵叉乘
A.*B—-表示矩阵对应元素的点乘
图像处理基础
1 图象和数字图像
1.1 图象的定义
用于各种观察系统以不同形式和手段观测客观世界而获得的,可以直接或间接作用域人眼并产生视觉知觉的实体。
1.2 图像的类型
- 广义:图片。动画,绘图,文字/文档
- 狭义:单幅->序列图像,静止->运动图像(视频),2D->3D,灰度->深度
2 图像的数字表达
2.1 图像的表示
2-D数组f(x,y)
x,y:2-D空间XY中坐标点的位置
f:代表图象在(x,y)的性质F的数值
f,x,y的值可以是任意实数
性质F:可对应不同物理量,
2.2 空间分辨率和幅度分辨率
图像必须需要在空间和灰度上都离散化才能被计算机处理,称为量化过程。
空间坐标的离散化称为空间采样,确定图像的空间分辨率。
灰度值的离散化成为灰度量化,确定图像的幅度分辨率。
分辨率与数据量:不同的量化精度确定了图像不同分辨率,以及分辨率紧密联系的数据量。
tip
一幅图像的尺寸(空间分辨率)为M*N,表明该图像包含MN个像素。如果每个像素都用G个灰度值的一个来赋值,表明在成像时量化了G个灰度级(幅度分辨率)。
存储一幅图像所需的数据量由图像的空间分辨率和幅度分辨率共同决定。
tip2
存储一幅图像所需的位数b(单位为比特,bit)为:
b=M*N*k
k为存储每个像素所需的bit数量
3 坐标约定
在MATLAB中用(r,c)表示行和列,坐标系原点在(1,1)处,水平向右为c垂直向下为r。
如下图M行、N列的一幅图像f(x,y)。r的最大值为M,c的最大值为N。
4 图像的输入输出和显示
4.1 imread方法
f=imread(‘filename.jpg’)文件可采用当前路径、绝对路径、相对路径。
其中f为获得的图像数组。
4.2 imshow方法
用法为imshow(f)。
4.3 imwrite方法
用法:imwrite(f,’outf.jpg’);同样可自定义路径。
如:
1 | imwrite(f,'E:\DATA\AFile\outf.tif') |
5 数据类
6 图像类型
6.1 灰度级图像
一个数据矩阵,矩阵的值表示灰度浓淡。
当灰度级图像元素是uint8时具有的范围[0,255]的整数值。
图像的数据类型是Double或者single,其值就是浮点数。
double或者single类型的灰度级图像通常会归一化到范围[0,1]。
tip:
uin8类型的图像—-将其每个像素的灰度值除以255得到double或single类型的灰度图像。
6.2 二值图像
取值只有0-1的逻辑矩阵。一个数值矩阵转换为二值图像,可使用logical函数
6.3 RGB图像
- 一副RGB图像是彩色像素的一个MN3数组;
- 每个像素点都从彩色图像相对应的红绿蓝三个分量。(见第六章p144)
- 分量图像的像素比特决定了RGB图像的比特深度。
- 一副RGB图像包含的色彩数范围是(2^b)^3,b是分量图像的比特数。
- 若所有分量图像都是一样的,则RGB图像是一副灰度图像,
- 操作:*
- 利用cat(级联)操作符将分量图像fRed,fGreen,fBlue组合成彩色图像:
1 | rgbim=cat(3,fRed,fGreen,fBlue) |
7 图像工程
7.1 图象技术和图像工程
略
7.2 图象工程的三个层次
- 图象处理:着重强调图像到图像之间进行的变换。对图像进行各种加工以改善图像的视觉效果并为自动识别打基础,或对图像进行压缩编码以减少对其所需存储空间或传输时间的要求。
- 图像分析:对图像中感兴趣的目标进行检测和测量,以获得它们的客观信息从而建立对图像的描述。图像分析是一个从图像到数据的过程,这里数据可以是对目标特征检测的结果或是基于测量的符号表示。
- 图像理解:重点是在图像分析的基础上,借助知识、经验等进一步研究图像中各目标的性质和他们之间的相互联系,并得出对图像内容含义的理解以及对原来客观场景的解释,从而指导和规划行动。

7.3 图象工程相关科学领域
- 图像识别、图像理解或计算机视觉。
7.4 图象工程的技术应用
- 视频通信、文字档啊、生物医学、遥感测绘、工业生产、军事公安、交通管理。
8 图像处理系统
8.1 图像系统构成框图
图像系统] –> B[输入] –> C[处理] –> D[存储] –> E[输出]
8.2 图像采集
- 需要物理器件对某个电磁能量谱波段进行接收并形成模拟的电信号。
- 将接受的模拟电信号转换为计算机能处理的数字或者离散的形式。
8.3 图像显示打印
- 1.图像显示
- 略*
- 2.图像半调输出
人眼的集成特征,通过控制二值点模式的形式,来获得视觉上不同的灰度感觉.
tip:
输出二值图像,看到的为灰度图像。
3.图像的幅度调制
调整输出黑点的尺寸来显示不同的灰度。
二值点是规则的排成网格的点
点的形状并不是决定性的因素4.图像的频率调制
输出黑点的尺寸是固定的,在空间的分布(点间的间隔或一定区域内点出现的频率)取决于所表示的灰度。
缺点:
点增益增加————>打印图灰度范围减少或压缩,减少了细节和反差。(点增益增加指打印单元尺寸相对于原始单元尺寸的增加量)
调制模板
- 每个输出单元–>若干个基本二值点
- 每个模板–>一个输出单元
制模板输出点的尺寸是固定的,但其点的频率或者说密度决定了灰度值。
下图为一个模板分成3*3网格可以输出10个灰度:
8.4 图像存储
- 存储形式
图像存储的最小单位为比特(bit)
字节(byte=8bit)–>千字节(K byte)–>兆字节(M byte)->吉字节(G byte)–>太字节(T byte) - 存储器
存储过程中使用快速存储器如计算机内存,帧缓存
较快调用时如磁盘。
较大:磁带光盘 - 格式
- 矢量格式
用线段或者线段的组合来表示图像(CAD)
特点 :存储小,内容特征突出,不利于描述复杂场景 - 光栅格式
特点:文件存储较大,内特征不突出,能表现各种复杂场景(BMP,GIF,JEPG,TIFF)
- 矢量格式
8.5 图象处理
- 图像增强
- 退化图像恢复
- 根据投影重建图像
- 减少图像编码
- 增加图像水印
三、图像变换与空间滤波
图像变换
1 图像坐标变换概述
- 空间域处理方法
坐标变换,亮度(灰度变换和空间滤波) - 空间域
指图像像素位置所在的空间,也称图像空间
坐标变换
将一副图像中的坐标位置映射到另外一副图像中的新坐标位置,不改变图像的像素值,只在图平面上进行像素的重新安排。
2 基本坐标变换
更详细介绍可查看链接如何通俗的解释仿射变换?
2.1 变换的表达
像素点的坐标标记为(x,y)齐次坐标则为(x,y,1)。
齐次坐标
n维的向量–>n+1维向量
例:
(x,y)二维向量–>(x,y,1)三维向量
齐次坐标属于投影几何坐标系统常用于仿射变换。
v’=AV
A为33变换矩阵,对于不同的变换,其元素值不同,A唯一确定其变换结果。
对于一组m个点的变换,令v1,v2,v3,…vm个组成3m矩阵V,则变换后的点矩阵V’为:
1 | V'=AV |
2.2 平移、缩放和旋转变换
旋转变换中可按照旋转轴更改仿射矩阵旋转图像,
3 坐标变换扩展
3.1 变换级联
当图像需要多种旋转方式,可按其变换方式依次相乘。称为变换级联。
级联变换只支持结合律,不支持交换律。
变换矩阵和反变换矩阵乘积为单位矩阵。
4 图像变换的MATLAB实现
平移:
1 | g=imtranslate(f, r, c); |
旋转:
1 | g=imrotate(f,a) |
缩放:
1 | g=imresize(f,scale)//等比缩放 |
图像间的运算
1 图像的算术和逻辑运算 (图象的算术和逻辑运算是逐像素进行的)
1.1 算术运算
- 加法:p+q
- 减法:p-q
- 乘法:p*q
- 除法:p÷q
1.2 逻辑运算
- 补:p=~q:NOT q
- 与:p&q:p AND q
- 或:q|p:qp OR q
- 异或:xor(p,q):p XOR q
MATLAB中将逻辑1或者非零值当作true处理
将逻辑0和数值0当作false处理
1.3 图像间算数和逻辑运算的特点
在(x,y)位置做一个算术运算或逻辑运算的结果可以存在其中一个图像的相应位置。
3 图像间运算的应用
3.1 图像间加法的运用
消除随机噪声处理
3.2 图像间减法的运用
- 设有图像f(x,y)和h(x,y)对它们相减,可获得两图差异:
g(x,y)=g(x,y)-h(x,y) - 常用于医学图像处理以消除背景。
- 在运动检测中对事件相邻的两幅图求差可以将图像中目标的位置和形状变化凸显出来。
3.3 图像间乘法和除法的运用
- 校正由于照明或者传感器的非均匀性造成的图像明暗变化.
- 模板运输
图像的灰度运算
1 图像灰度映射原理
- 将图像f(x,y)中的每个像素的灰度按灰度映射函数E(H)操作直接变换得到图像g(x,y),以达到增强视觉效果的目的。
- 直灰度映射是一种点操作:t=E(H)(s)
- 图像灰度映射的关键是根据增强要求设计灰度映射函数,或映射规则。
常用的图像灰度映射函数:
图像求反、增强对比度、动态范围压缩、灰度切分 - 伽马矫正
借助指数变化进行,指数变换形式为:t=Cs^y (s是灰度,自变量;C是常数,γ是实数) - 当γ<1时—-输入中较窄的灰度范围被映射到输出中较宽的灰度范围,而输入中较高的高灰度范围被映射到输出中较窄的灰度范围。
关于伽马校正
为图像进行伽马编码的目的是用来对人类视觉的特性进行补偿,从而根据人类对光线或者黑白的感知,最大化地利用表示黑白的数据位或带宽。在通常的照明(既不是漆黑一片,也不是令人目眩的明亮)的情况下,人类的视觉大体有伽马或者是幂函数的性质。如果不将图像进行伽马编码,那么数据位或者带宽的利用就会分布不均匀——会有过多的数据位或者带宽用来表示人类根本无法察觉到的差异,而用于表示人类非常敏感的视觉感知范围的数据位或者带宽又会不足。图像的伽马编码并不是必须的(甚至有的时候会适得其反),浮点数格式的颜色值已经提供了一部分对数曲线的线性估计。
–来自《维基百科–伽马校正》
2 灰度变换的MATLAB函数
2.1 imadjust 和 stretchlim
- 函数imadjust用于对灰度级图像进行灰度变换。
1 | g=imadjust(f,[low_in high_in],[low_out high_out],gamma) |
Low_High是一个两元素向量,由灰度级底限和高限组成,默认为图像f中充满灰度级底部和顶部1%的灰度底限和高限。
关于灰度变换的具体操作可见 dip_example0201.m
2.2 对数交换
对数与对比度拉伸变换是进行动态范围处理的基本工具。
对数数学变换表达式:
1 | g=c*log(1+double(f)) |
其MATLAB表达式:如8比特
1 | g=im2uint8(mat2gray(g)) |
2.3 对比度拉伸变换
对比度拉伸数学表达式为:
1 | s=T(r)=1/(1+(m/r)^E) |
其MATLAB表达式:
1 | g=1./1+(m./double(f)).^E |
2.4对于灰度变换的使用M函数
获得输入/输出参数个数及其检测的函数:
- n=nargin—-用于获得输入参数个数,n是number的缩写,arg指参数,为输入。
- n=nargout—-用于获得输出参数个数,n是number的缩写,arg指参数,为输出。
- msg=nargchk(low,high,number)—-检测传递的参数个数number是否在[low,high]范围中,这是chk是check的缩写。
- cellvar=varargin—–获得可变参数的输入单元数组变量。
- cellvar=varargout—–获得可变参数的输出单元数组变量。
将其他类型的图像转换为浮点数类型图像:
1 | [g,revertclass]=tofloat(f) |



