文章目录
介绍
数字图像处理 vs. 计算机视觉*
名词 | 定义 | 特征 | 输入与输出 |
---|---|---|---|
数字图像处理 | 将图像信号转化为数字信号并利用计算机对其处理的过程 | 主要涉及底层操作 | 输入图像->输出图像 |
计算机视觉 | 使用计算机及相关设备对生物视觉的一种模拟 | 除了底层操作,还包含中层、高层分析与理解 | 输入图像->输出图像/表征属性(类别、区域) |
综合比对该表来看,数字图像处理可以看作计算机视觉的子集,计算机视觉是一项采用机器学习进行图像处理和模式识别的技术。
常见场景挑战*
-
图像是3D空间的2D投影
3D模型能得到唯一的2D图像,但2D图像却得不到唯一的3D模型。 -
视角变换
对于同一个3D模型,采用不同的视角,能得到各式各样的2D图像。 -
非刚性形变
对于同一个3D模型,发生非刚性形变,使得得到的图像有所差异。 -
遮挡问题
对于同一个3D模型,一旦被遮挡,就会失去一些信息。 -
光照变换
对于同一个3D模型,受到不同的光照,会产生一些不同。 -
快速移动
对于同一个3D模型,在高速移动下,会产生一些模糊,导致得到的信息有误。 -
类间与类内的差异
常见于分类问题中,同类之间差异大,不同类之间差异小,会造成分类错误。
综上所属,上述问题2~6可归结为同一物体受不同条件影响下的分析,1和7可单独记忆。
图像直方图和平面几何变换
图像直方图
灰度图像
- 二维网络,每个网格存储观测到的像素值/灰度值。
- 可以看作一个 M × N M\times N M×N维的矩阵,对于sRGB图像,其元素值的范围在 [ 0 , 255 ] [0,255] [0,255]。
- 一共有256个值,0是黑色,255是白色。
图像的灰度值可看作一个函数,
g
(
i
,
j
)
:
B
→
g
g(i,j):B\to g
g(i,j):B→g
其中,
B
B
B是一个坐标,范围为
(
0
,
0
)
→
(
i
−
1
,
j
−
1
)
(0,0)\to(i-1,j-1)
(0,0)→(i−1,j−1);
g
g
g是一个灰度值,范围为
[
0
,
255
]
[0,255]
[0,255]。
直方图
- 直方图的定义:一种用于描述数据统计分布情况的表示方法;
- 直方图的坐标:横坐标是统计样本(灰度值);每个柱条的宽度表示一段取值范围;纵坐标对应着某个属性的度量(拥有这个灰度值的像素数量);
- 直方图的预处理:通常会对直方图进行归一化:将直方图上的每个属性的计数除以所有属性的计数之和;
直方图可以是一张频数图、也可以是一张概率图,沟通它们的桥梁是归一化,两者都反映了分布情况。通常我们用频数图,但涉及到统计意义时,采用概率图。
图像直方图
- 图像直方图的定义:描述了像素值的分布情况;
- 图像直方图 h ( g ) h(g) h(g)定义为数值为 g g g的像素值个数;
- 统计意义为:图像中随机一个像素它具有的像素值 g g g的概率 p ( g ) = h ( g ) N p(g)=\frac{h(g)}{N} p(g)=Nh(g)。
计算步骤*
- 构造一个长度为256的向量 h h h;
- 将 h h h初始化为全0;
- 对于图像的每个像素 ( i , j ) (i,j) (i,j),计算 h ( g ( i , j ) ) + + h(g(i,j))++ h(g(i,j))++。
其计算复杂性和像素个数成正比,所以是 O ( n ) O(n) O(n)。
累计直方图*
H
(
g
)
=
∑
x
=
0
g
h
(
g
)
=
满
足
条
件
g
(
i
,
j
)
≤
g
的
像
素
个
数
H(g)=\sum_{x=0}^gh(g)=满足条件g(i,j)\le g的像素个数
H(g)=x=0∑gh(g)=满足条件g(i,j)≤g的像素个数
将直方图归一化,可以得到概率密度函数;而将累计直方图归一化可以得到累计分布函数。
F
(
g
)
=
H
(
g
)
N
F(g)=\frac{H(g)}{N}
F(g)=NH(g)
直方图的性质
- 均值:描述了图像的亮度;
- 方差:描述图像的对比度;
- 中值:描述图像的亮度,比均值更鲁棒(因为对离群点不敏感)。
每个像素是都有一个灰度值,对这些灰度值做计算得到上述三个统计指标。
彩色图像的图像直方图
为彩色图像的每个通道计算一个图像直方图。
图像直方图变换
对直方图进行变换可以改变图像直方图的性质。
点操作(以线性函数为例)*
- 仅基于输入的单点像素值进行映射, 将其映射到一个新的像素值;
- 对某一点像素值的映射只与它本身有关,与其他像素值无关。
- 调节亮度:增大 ( k > 0 ) (k\gt0) (k>0),减小 ( k < 0 ) (k\lt0) (k<0);
- 调整对比度:增大 ( m > 1 ) (m\gt1) (m>1),减小 ( m < 1 ) (m\lt1) (m<1),翻转 ( m = − 1 ) (m=-1) (m=−1)。
因为像素值的范围为
[
0
,
255
]
[0,255]
[0,255],所以还需要考虑截断操作,保持其范围。常用的阶段函数如下所示:
图中的曲线就是点操作函数。原本是恒等映射,现在将暗的像素变得更暗,亮的像素变得更亮。
单调映射函数*
点操作的常见方式有两种:
- 查表:满足预先定义好映射关系;把所有的输入像素值和输出像素值对应关系都存储在一个数组中,通过读取数组在获得新的像素值;
- 单调映射函数:满足自定义的性质;给定输入图像的直方图 h a ( a ) h_a(a) ha(a)和映射函数 f f f,计算输出图像的直方图 h b ( b ) h_b(b) hb(b)。
常见的题型是:已知原始像素直方图 h a ( a ) h_a(a) ha(a)和映射函数 f ( a ) f(a) f(a),求解新的像素直方图 h b ( b ) h_b(b) hb(b)。
其核心思想是:因为是单调映射函数,所以每一个像素值都会对应唯一的像素值,那么两个直方图函数之间的面积应该是相等的。
基于这个核心思想,开始建模:
- 原始区域 [ a , a + d a ] [a,a+da] [a,a+da]映射到新区域 [ b , b + d b ] [b,b+db] [b,b+db];
- 因为映射前后的面积相等,所以有 h a ( a ) d a = h b ( b ) d b h_a(a)da=h_b(b)db ha(a)da=hb(b)db。
于是,可以得到新的直方图函数
h
b
(
b
)
=
h
a
(
a
)
∣
d
b
d
a
∣
h_b(b)=\frac{h_a(a)}{|\frac{db}{da}|}
hb(b)=∣dadb∣ha(a)
需要注意的是,映射的对象是像素值,即 b = f ( a ) b=f(a) b=f(a),所以上式可进一步化简为 h b ( b ) = h a ( a ) ∣ f ′ ( a ) ∣ h_b(b)=\frac{h_a(a)}{|f'(a)|} hb(b)=∣f′(a)∣ha(a)
最后,因为是要表达出关于b的直方图函数,所以需要将其中的a转化为b,于是有 h b ( b ) = h a ( f − 1 ( b ) ) f ′ ( f − 1 ( b ) ) h_b(b)=\frac{h_a(f^{-1}(b))}{f'(f^{-1}(b))} hb(b)=f′(f−1(b))ha(f−1(b))
如果这个函数是具体的话需要进一步求出来。
直方图均衡化*
直方图均衡化的目的:使得直方图的每个柱条内的高度,即对应每个像素值的像素个数相等,
h
b
(
b
)
=
c
o
n
s
t
h_b(b)=const
hb(b)=const
对于均衡化来说,重点转化为了根据 h a ( a ) h_a(a) ha(a)和 h b ( b ) h_b(b) hb(b)求解 f ( a ) f(a) f(a)。
围绕着面积相等这一关系,计算微分方程即可。
一阶可分离变量方程
d
y
d
x
=
h
(
x
)
g
(
y
)
\frac{dy}{dx}=h(x)g(y)
dxdy=h(x)g(y)
首先分离变量
d
y
g
(
y
)
=
h
(
x
)
d
x
\frac{dy}{g(y)}=h(x)dx
g(y)dy=h(x)dx
再对两边积分有
⎰
d
y
g
(
y
)
=
⎰
h
(
x
)
d
x
+
c
\lmoustache\frac{dy}{g(y)}=\lmoustache h(x)dx+c
⎰g(y)dy=⎰h(x)dx+c
因为推导时,函数是连续的,而实际上,直方图都是离散的,所以存在量化误差且不以平均的形式出现。
直方图均衡化的优点
- 增加对比度(方差变大了);
- 局部对比度低的区域获得更大的对比度增强;
- 使得整幅图像的像素值尽量均匀分布。
缺点在于:暗区域的噪声被放大。
图像几何变换
将一幅图的坐标位置映射到另一幅图的新的坐标位置。主要区别在于未知的改变,而不是像素值分布的改变。
首先,我们给出规范的符号定义:
图像
a
(
x
,
y
)
a(x,y)
a(x,y)(其实这是一个像素值-坐标映射函数),对应坐标系统
S
a
S_a
Sa,其坐标定义为
a
x
=
[
a
x
,
a
y
]
T
^a\bold x=[^ax,^ay]^T
ax=[ax,ay]T;
图像
b
(
x
,
y
)
b(x,y)
b(x,y),对应坐标系统
S
b
S_b
Sb,其坐标定义为
b
x
=
[
b
x
,
b
y
]
T
^b\bold x=[^bx,^by]^T
bx=[bx,by]T.
几何变换的目的:将图像从坐标系统 S b S_b Sb变换到坐标系统 S a S_a Sa,即 [ b x , b y ] → [ a x , a y ] [^bx,^by]\to [^ax,^ay] [bx,by]→[ax,ay]。
几何变换是沟通这两个坐标系统的映射函数
a
x
=
a
T
b
(
b
x
)
^a\bold x=^aT_b(^b\bold x)
ax=aTb(bx)
总体来看,有
a
x
=
[
a
x
,
a
y
]
T
=
[
T
x
(
b
x
,
b
y
)
,
T
y
(
b
x
,
b
y
)
]
T
=
a
T
b
(
b
x
)
^a\bold x=[^ax,^ay]^T=[T_x(^bx,^by),T_y(^bx,^by)]^T=^aT_b(^b\bold x)
ax=[ax,ay]T=[Tx(bx,by),Ty(bx,by)]T=aTb(bx)
常见几何变换
- 平移变换 a x = [ T x ( b x , b y ) , T y ( b x , b y ) ] T = [ b x , b y ] T + [ t x , t y ] T ^a\bold x=[T_x(^bx,^by),T_y(^bx,^by)]^T=[^bx,^by]^T+[t_x,t_y]^T ax=[Tx(bx,by),Ty(bx,by)]T=[bx,by]T+[tx,ty]T
- 仿射变换
图像插值
在进行几何变换的时候,函数很容易将位置坐标映射为非整数,这就让代码很难办,这不是整数没法索引啊。于是需要进行插值或者重采样。
最近邻插值*
取新坐标位置在空间上最近的邻居的像素值为其像素值,也就是 a ( [ a x ] , [ a y ] ) = b ( b x , b y ) a([^ax],[^ay])=b(^bx,^by) a([ax],[ay])=b(bx,by)
双线性插值*
按顺序在
x
x
x和
y
y
y方向分别进行线性插枝,新分配的值是4个相邻坐标像素值的加权。
为对位距离,因为越近的话,权重越大,对位距离越大。
图像扭曲
几何变换分为仿射变换和透视变换。图像扭曲又称为仿射变换,通常有两种,分别是前向扭曲映射和反向扭曲映射。
本质就是确认坐标、确认像素值的过程。
前向扭曲映射*
为源图像中的每一个像素计算其在目标图像中的位置及对应的像素值,从而得到一幅新的图像。
其公式为:
a
x
=
a
T
b
(
b
x
)
^a\bold x=^aT_b(^b\bold x)
ax=aTb(bx)
其伪代码为:
其缺点有:
- 输出图像的某一点像素值不能直接得到,需要遍历输入图像的所有像素值(插值需要);
- 混叠,模糊,丢失高分辨率特征,很多像素叠在一起;
- 裂缝、空洞,部分像素没有值。
后向扭曲映射*
为目标图像中的每一个像素,在源图像中找到其相应的位置及对应的像素值,从而得到一幅新的图像。
其公式为:
b
x
=
b
T
a
(
a
x
)
^b\bold x=^bT_a(^a\bold x)
bx=bTa(ax)
其伪代码为:
其优点有:
- 一一对应,再无空洞;
- 用fillter控制混叠;
- 计算量小。
差别在于,都会有混叠,但是我像素值能确定。