第一周学习笔记
第一章
-
什么是数字图像处理?
一幅图像可以定义为一个二维函数$f(x,y)$,$f$在任意处的幅度为该点处图像的亮度或灰度,当x,y,$f$都为有限的离散值时,该图像为数字图像。数字图像处理就是用计算机处理数字图像。
本书中所谓的数字图像处理包含输入输出都是图像的过程,从图像中提取特征的过程,以及对单个对象进行识别的过程,包含了图像处理的低中高三级处理。
-
MATLAB
MATLAB集成了计算、可视化和编程,它是一种交互式系统,其基本数据元素是并不要求确定维度的的一个数组,能让我们用公式方便的解决涉及矩阵的问题,所以十分适用于图像处理
MATLAB中扩展名为.m是脚本文件或函数文件,扩展名为.mat是保存的变量
第二章 基本原理
2.1~2.4 数字图像的表示及操作
数字图像的表示
一副图像就是一个二维函数$f(x,y)$,其中x、y是空间(平面)坐标,$f$在任意点处的振幅就是该点处的亮度或者灰度(灰度是用来表示黑白图像的亮度的)。
彩色图像是由单个二维图像组成的,例如RGB图像就是三个分量图像组合而成(红、绿、蓝)。因此,许多应用在黑白图像上的处理技术,也可以应用到彩色图像上。
坐标数字化称为取样,振幅的数字化称为量化。当$f$的x,y分量和振幅都是有限且离散的量时,称该图像为数字图像。
坐标约定
取样和量化的结果是一个实数矩阵。坐标表示的意思是在当前行取值的像素点。如(0,0)(书籍中图像原点的定义(x,y) = (0,0),工具箱中原点定义为(r,c) = (1,1))就是在第一行的第一个取样,而不是取样的实际物理地址。
IPT还使用一种极少使用的空间坐标约定,与我们平时使用的x,y正好相反。
图像矩阵表示
数字化图像函数表示:
MATLAB中表示:
其中$f(0,0)$ = f(1,1),这里斜体是数字化图像,等宽字体代表MATLAB中的表示。
数字图像的读取
imread函数
- imread('filename')
- imread和imwrite支持的一些常用图像类型
- size(f) 获得一副图像的行数和列数
- whos f 获得图像的一些附加信息
数字图像的显示
-
imshow(f, G) 基本语法
f是一个图像数组,G是该图像的灰度级数(缺省值为256)
-
imshow(f, [low high])
显示图像小于low的像素点显示为黑色,大于high的像素点显示为白色。介于两者之间的以默认的级数显示为中等亮度值。
-
imshow(f, [])
low设置为数组f的最小值,high设置为数组f的最大值。此用法在显示一副动态范围小或既有负值又有正值的图像十分有用
-
pixval
交互显示单个像素的亮度值
数字图像的存储
我们在后续章节处理的大多是JPEG和TIFF格式的图像
-
imwrite(f, 'filename')
-
imwrite(f, 'filename', 'quality', q) 常用但只适用于JPEG图像
q是一个在0~100之间的整数,q越小,图像退化越严重
补充知识:
- bitdepth,位深度,一个像素存储的位数
- 伪边缘,图像中出现的类似等高线的轮廓线
-
imwrite(f, 'filename', 'compression', 'parameter', ..., 'resolution', [colres rowres]) 只适用于tif图像
-
parameter主要为以下值
- none 无压缩
- packbits 非二值图像的默认参数
- ccitt 二值图像默认参数
-
[colres rowres]
表示以每单位中的点数给出图像的列分辨率和行分辨率(缺省值为[72 72]),使用res和[res res]来表示指定分辨率是等价的
-
-
使用print命令将图像输出到磁盘
print -fno -dfileformat -rresno filename
- no是图形窗口的图形编号
- fileformat是输出文件格式
- resno指定分辨率(单位dpi)
- filename指定输出文件名
- 例子:print -f1 -dtiff -r75 test
问题:为什么是tif图像而不是其他?
答案:tif图像的可拓展性强(查阅资料我个人觉得是这点,不知道老师对这个的解答是什么),除了图像之外还可以写入额外的信息。而且jpg等图像还能直接嵌入tif图像中。tif图像拓展名一般为.tif或.tiff。tif图像三个重要组成:IFH(Image File Header)、IFD(Image File Directory)、DE(Directory Entry)
2.6~2.10 MATLAB数据类型以及M函数
数据类
图像类型
亮度图像
一副亮度图像就是一个数据矩阵,其归一化的取值代表亮度。
uint8类或uint16类,整数值范围分别是[0,255][0,65535]。
若像素是double类,则像素的取值就是浮点数。规定双精度归一化亮度图像的取值范围为[0,1]。
二值图像
一副二值图像是一个取值只有0和1的逻辑数组。
所以取值只有0和1的uint8类数组再MATLAB中不是二值图像,但可以使用logical函数将数组转化为逻辑数组。也可以使用islogical判断是否为逻辑数组
一幅图像的特征是由数据类和图像类型这两张来表征的
数据类型转换
通用语法是:B = data_class_name(A)
图像类型转换
索引
-
转置运算符(.')将行向量变成列向量
-
v(:)将产生一个列向量
-
v(a,x,b)索引,中间为步长,从a取到b
-
A([1 3],:)挑选第1和3的两行
-
B(:,3)=0可使B的第3列都为0
-
linspace(a,b,n)产生含n个元素的行向量,这n个元素线性地隔开并且包含a和b
-
plot(f(500,:))显示通过其间的水平扫描线
-
ndims(A)给出A的维数
ps(标准数组) : zero(M,N), ones(M,N), ture(M,N), false(M,N), magic(M), rand(M,N), randn(M,N)
MATLAB编程
M文件组成部分为:
- 函数定义行
- H1行
- 帮助文本
- 函数体
- 命令
函数定义行形式:
function [outputs]=name(inputs)
例如:
function [s,p]=sumprod(f,g)
ps :输出用中括号,输入用圆括号
MATLAB不复制信息,在B=A中MATLAB将做一个BB等于A的“记录”,并不复制,除非A的内容以后发生了改变。图形等价于二维数组
运输符 | 名称 |
---|---|
& | AND |
| | OR |
~ | NOT |
== | 逻辑等于 |
~= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
函数 | 返回值 |
---|---|
ans | 最新的变量,未赋给表达值输出变量的给它 |
eps | 浮点数的相对精度 |
pi | π |
代码优化
-
向量化循环
向量化意味着简单地将for循环和while循环转化为等价的向量或矩阵运算
ps:“向量化”(完全抽象出循环并仅描述对数组而不是元素的操作)是重写循环的过程,以便与其同时处理(例如)数组的4个元素N / 4次,而不是处理数组的单个元素N次。
例子:
for x = 1:M f(x) = A * sin((x-1)/(2*pi)); end %向量化 x = 0:M-1; f = A*sin(x/(2*pi));
向量化代码的运行速度要比基于for循环的代码的运行速度快很多
-
预处理数组
处理大数组时,预分配可以加快执行速度,也可以帮助我们减少存储器碎片。预处理通过计算开始时就允许MATLAB为大数据构造保留足够的存储空间,来阻止无连续空间的情形出现。
f = zeros(1024);
-
单元数组、结构体
单元数组类似于列表,通过数字索引取值(从1开始),例如a为结构,a{1}取值。(单元数组的重要属性包含的是参量的副本,而不是指向该参量的指针)
结构类似于c语言中的结构体,例子:
>> S.name='shaoye'; >> S.age=18; >> S.name ans = shaoye