什么是数字图像处理?
一幅图像可以定义为一个二维函数$f(x,y)$,$f$在任意处的幅度为该点处图像的亮度或灰度,当x,y,$f$都为有限的离散值时,该图像为数字图像。数字图像处理就是用计算机处理数字图像。
本书中所谓的数字图像处理包含输入输出都是图像的过程,从图像中提取特征的过程,以及对单个对象进行识别的过程,包含了图像处理的低中高三级处理。
MATLAB
MATLAB集成了计算、可视化和编程,它是一种交互式系统,其基本数据元素是并不要求确定维度的的一个数组,能让我们用公式方便的解决涉及矩阵的问题,所以十分适用于图像处理
MATLAB中扩展名为.m是脚本文件或函数文件,扩展名为.mat是保存的变量
一副图像就是一个二维函数$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中的表示。
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越小,图像退化越严重
补充知识:
imwrite(f, ‘filename‘, ‘compression‘, ‘parameter‘, ..., ‘resolution‘, [colres rowres]) 只适用于tif图像
parameter主要为以下值
[colres rowres]
表示以每单位中的点数给出图像的列分辨率和行分辨率(缺省值为[72 72]),使用res和[res res]来表示指定分辨率是等价的
使用print命令将图像输出到磁盘
print -fno -dfileformat -rresno filename
问题:为什么是tif图像而不是其他?
答案:tif图像的可拓展性强(查阅资料我个人觉得是这点,不知道老师对这个的解答是什么),除了图像之外还可以写入额外的信息。而且jpg等图像还能直接嵌入tif图像中。tif图像拓展名一般为.tif或.tiff。tif图像三个重要组成:IFH(Image File Header)、IFD(Image File Directory)、DE(Directory Entry)
一副亮度图像就是一个数据矩阵,其归一化的取值代表亮度。
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)
M文件组成部分为:
函数定义行形式:
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
原文:https://www.cnblogs.com/foolshao/p/12906510.html