图像预处理
1. 像素亮度变换
像素亮度变换修改像素的亮度,变换只取决与各像素自身的性质。
1.1 位置相关的亮度校正
在理想的情况下,图像获取和数字化设备的灵敏度不应该与图像的位置有关,实际情况下是不对的。光线离光轴越远透镜对它削弱越多。
如果退化具有系统性,就可以通过亮度校正加以抑制。一个乘性的错误系数
e(i,j)
描述相对于理想的等同传递函数的变化。假设
g(i,j)
是原来没有退化的图像,
f(i,j)
是含有退化的图像
f(i,j)=e(i,j)g(i,j)
如果抓取到已知亮度的一幅参考图像,最简单的情况是具有不变的亮度c,则可以获得错误系数
e(i,j)
.退化结果是图像
fc(i,j)
。抑制
g(i,j)=f(i.j)e(i,j)=cf(i,j)fc(i,j)
这种方法隐含的假设了变换的线性。
1.2 灰度级变换
灰度级变换不依赖于像素在图像中的位置。一个变换
T
,将原来范围
[p0,pk]
内的亮度
p
变换为一个新范围
[q0,qk]
内的亮度
q
。
q=T(p)
。
常见的灰度级变换:分段线性函数
a
增强了图像在亮度
p1和p2
之间的图像对比度。函数
b
被称为作亮度阈值化(brightness thresholding),结果是黑白(black-and-white)图像。
直方图均衡化(histogram equalization): 创建一幅在整个亮度范围内具有相同分布的亮度图像。直方图均衡化增强了靠近直方图极大值附近的亮度的对比度,减少了极小值附近的对比度。
- 输入的直方图用
H(p)
表示,输入的灰度级范围是
[p0,pk]
,找到一个单调的像素亮度变换
q=T(p)
使输出的直方图
G(q)
在整个输出亮度范围
[q0,qk]
是均匀的。
- 直方图可以看为离散的概率密度函数。变换
T
的单调意味着
∑i=0kG(qi)=∑i=0kH(pi)
- 假设图像有
N
行和列,那么均衡化的直方图
G(q)
就对应着均衡的概率密度函数
f
,其函数值是一个常数
f=N2qk−q0
- 连续密度函数:
N2∫qq01qk−q0ds=N2(q−q0)qk−q0=∫pp0H(s)ds→q=T(p)=qk−q0N2∫pp0H(s)ds+q0
- 离散的情况:
q=T(p)=qk−q0N2∑i=p0pH(s)+q0
算法:直方图均衡化:
- 对于有
G
个灰度级(一般256)大小为
M×N
的图像,创建一个长为
G
的数组H并初始化为0。
- 形成图像直方图:扫描每个像素,增加相应的H成员,当像素
p
具有亮度
gp
时,做
H[gp]=H[gp]+1
。
- 形成累积的直方图
Hc
:
Hc[0]=H[0]Hc[p]=Hc[p−1]+H[p],p=1,2,⋯,G−1
- 置
T[p]=round(G−1MNHc[p])
(这一步骤构造一个是NM倍数的与单调增加的
Hc
中的值对应的查找表,有助于提高实现的效率)。
- 重新扫描图像,写一个具有灰度级
gq
的输出图像,设置
gq=T[gq]
。
2 几何变换
几何变换是一个矢量函数
T
,将一个像素
(x,y)
映射到一 个新位置
(x′,y′)
。T定义了两个分量公式
x′=Tx(x,y)y′=Ty(x,y)
步骤:
- 像素坐标变换(pixel co-ordinate transformation)
- 确定亮度值。通常用邻域中的几个点的亮度插值(interpolation)计算的。
2.1 像素坐标变换
坐标:通常用多项式公式来近似
x′=∑r=0m∑k=0m−rarkxryky′=∑r=0m∑k=0m−rbrkxryk
这个变换对于系数
ark,brk
来说是线性的,因此如果已知在两幅图像中的对应点对
(x,y),(x′,y′)
,就可以通过求解线性方程组的方程确定
ark,brk
,一般使用的点数超过系数以便保证稳定性,常使用均方方法(mean square method)
在几何变换依赖图像中位置的变化并不快的情况下,使用低阶数的多项式近似,m=2或m=3,至少需要6或10个对应点对。对应点在图像中的分布应该能够表达几何变换,通常他们是均匀分布。阶数越高,几何变换对应于点对的分布就越敏感。
x′=a0+a1x+a2y+a3xyy′=b0+b1x+b2y+b3xy
x′=a0+a1x+a2yy′=b0+b1x+b2y
至少需要3对点对。
包含:旋转,平移,变尺度,和歪斜。
雅可比(Jacobian)
J
提供了坐标系如何变化的信息。
J=|∂(x′,y′)∂(x,y)|=∂x′∂x∂y′∂x∂x′∂y∂y′∂y
如果变换是奇异的
J=0
。如果图像的面积在变换下具有不变性
J=1
。
双线性变换的雅可比:
J=a1b2−a2b1+(a1b3−a3b1)x+(a3b2−a2b3)y
仿射变换:
J=a1b2−a2b1
重要几何变换
- 旋转(rotation):绕原点旋转角度
ϕ
:
⎧⎩⎨x′=xcosϕ+ysinϕy′=−xsinϕ+ycosϕJ=1
- 变尺度(change of scale),x轴是
a
,
y
轴是
b
⎧⎩⎨x′=axy′=byJ=ab
- 歪斜(斜切)(skewing),歪斜角度
ϕ
:
⎧⎩⎨x′=x+ytanϕy′=yJ=1
2.2 亮度插值
亮度插值影响着图像的品质,插值越简单,在几何和光度测量方向精度的损失越大。常用:最近邻,线性,双三次(bi-cubic)。
亮度插值问题一般用对偶的方法来表达,确定对应于输出图像离散光栅点在输入图像中原来点的亮度
(x,y)=T−1(x′,y′)
记亮度插值的结果为
fn(x,y)
,其中n区分不同的插值方法。卷积公式表示:
fn(x,y)=∑l=−∞∞∑k=−∞∞gs(lΔx,kΔy)hn(x−lΔx,y−kΔy)
-
hn
为插值核(interpolation kernel)
插值方法
最近邻插值(neartest-neighborhood interpolation):复制点
(x,y)
以在离散光栅中离它最近的点
g
的亮度数值。
f1(x,y)=gs[round(x),round(y)]
定位误差最大为半个像素,在变换后可能会呈现阶梯状。
线性插值(linear interpolation):考虑点
(x,y)
的四个相邻点。假设亮度函数在这个邻域内是线性的。
公式:
f2(x,y)=(1−a)(1−b)gs(l,k)+a(1−b)gs(l+1,k)+b(1−a)gs(l,k+1)+abgs(l+1,k+1)
-
l=floor(x),a=x−l
-
k=fllor(y),b=y−k
线性插值可能会引起小的分辨率的降低和模糊。减轻了在最近邻插值中的阶梯状直边界的问题。
双三次插值(bi-cubic interpolation):用双三次多项式表面局部地近似亮度函数来改善其模型,用16个相邻的点作插值。
一维的插值核(墨西哥草帽Mexican hat):
h3=⎧⎩⎨⎪⎪1−2|x|2+|x|34−8|x|+5|x|2−|x|30当0≤|x|≤1当1≤|x|≤2其他
双三次插值免除了最近邻插值的阶梯状边界问题,也解决了线性插值的模糊问题。双三次插值通常用于光栅显示中。
3 局部处理
使用输入图像中一个像素的小邻域来产生输出图像中心新的亮度数值的方法。也叫滤波(filtration/filtering)。
处理:
- 第一组:平滑(smoothing):目的在于抑制噪声或其他小的波动,等同于傅里叶变换域抑制高频部分。平滑也会模糊所有的含有图像重要的信息。
- 第二组:梯度算子(gredient operators)基于图像函数的局部导数。导数在图像函数快速变化的位置较大,梯度算子的目的是在图像中显现这些位置。梯度算子在傅里叶变换域有抑制低频部分的类似效应。噪声本质上通常是高频的。梯度算子会抬高噪声水平。
变换:
线性(linear)
线性操作中输出图像像素
g(i,j)
的计算结果是输入图像像素
f(i,j)
的一个局部邻域
O
的亮度的线性组合,邻域
O
像素的贡献用系数
h
加权:
f(i,j)=∑(m,n)∈O∑h(i−m,j−n)g(m,n)
以
h
为核的离散卷积等价,称
h
为卷积掩膜(convolution mask)
非线性(non-linear)
3.1 图像平滑
图像平滑是一类局部预处理方法,主要用于抑制图像噪声,利用图像数据的冗余性。新值的计算是基于某个邻域
O
中亮度数值的平均。
平滑有造成图像中明显边缘变得模糊的问题,集中考虑能够保持边缘(edge preserving)的平滑方法。仅使用邻域中与被处理的点有相似性质的那些点作平均。
平均(averaging)噪声抑制的统计原理
假设:每个像素处的噪声数值
v
是独立分布的随机变量。具有0均值和标准差
σ
,我们可以在相同条件下抓取同一场景的静态图像
n
次,对于每幅抓取图像,都有特定的像素
g,i=1,2,⋯,n
,其中下表
i
表示像素值
gi
属于那幅图像。
g1+⋯+gnn+v1+⋯+vnn
第二项描述噪声的影响。它仍是一个随机变量,具有0均值和标准差
σn√
。
平滑在没有模糊图像的基础上公式:
f(i,j)=1n∑k=1ngk(i,j)
特性:
- 样本均值分布的均值等于数据的均值
- 样本均值分布的方差小于原有数据的方差。选取了n个样本,数据的标准差为
σn√
- 若原来的分布为正态分布,样本均值分布也是正态分布。所有的均值都会收敛于一个正态分布(中心极限定理 central limit theorem)
- 通过置信区间,可以表示对描述数据的参数的可信程度。
可分离滤波器(separable filters):卷积滤波器中一类重要的特殊滤波器。在二维分离意味着,卷积核可以分解成两个一维向量的乘积。
g(x,y)=∑m=−NN∑n=−NNh(m,n)f(x+m,y+n)=∑m=−NNh1(m)∑n=−NNh2(n)f(x+m,y+n)
使用旋转掩膜的平均(averaging using a rotating mask)
非线性的平滑方法,通过搜索当前像素邻域的同态部分,可以避免边缘模糊。结果实际是锐化图像。
亮度的平均只在这个区域计算,一个亮度散布
σ2
用作区域的一致性度量。
设区域
R
的像素数目是
n
且输入图像是
g
。
σ2=1n{∑(i,j)∈R[g(i,j)−1n∑(i,j)∈Rg(i,j)]2}
化简:
σ2=1n∑(i,j)∈R{[g(i,j)]2−2g(i,j)∑(i,j)∈Rg(i,j)n+[∑(i,j)∈Rg(i,j)n]2}=1n{∑(i,j)∈R[g(i,j)]2−[∑(i,j)∈Rg(i,j)]2n}
算法:使用旋转掩膜的平滑
- 考虑图像的每个像素
(i,j)
。
- 计算像素
(i,j)
所有可能的旋转掩膜的散布。
- 选择具有最小散布的掩膜
- 将所选掩膜内的平均亮度赋给输出图像中的像素
(i,j)
。
中值滤波是一个减少边缘模糊的非线性平滑方法。思想是:邻域中亮度的中值代替图像当前的点。
算法:高效的中值滤波
置
th=mn2
,如果
m
和
n
都为奇数,则对
th
取整。可以避免不必要的浮点数运算。
将窗口移至一个新行的开始,对其内容排序。建立窗口像素的直方图
H
,确定其中值
m
,计算亮度小于或等于
m
的像素数目
nm
。
对于最左列亮度是
pg
的每个像素
p
,做
H[pg]=H[pg]+1
,进一步,如果
pg<m
,置
nm=nm−1
将窗口右移一列,对于最右列亮度是
pg
的每个像素
p
,做
H[pg]=H[pg]+1
,如果
pg<m
,置
nm=nm+1
如果
nm=t
则跳转至步骤8
如果
nm>t
则跳转至步骤7
重复
m=m+1nm=nm+H[m]
直到
nm≥t
,则跳转至步骤8
(此时有
nm>t
)。重复
m=m−1nm=nm−H[m]
,直至
nm≤t
。
如果窗口的右侧列不是图像的右边界。跳转至步骤3
如果窗口的底行不是图像的下边界,跳转至步骤2。
缺点:矩形邻域中值滤波的主要缺点是图像中的细线和显著角点会遭到破坏,使用保持水平/垂直的线条可以避免。
中值平滑是更一般的等级滤波(rank filtering) :将某个邻域中的像素排成序列。预处理的结果是在该序列上的某个统计值,中值是其可能之一。
统计排序滤波(order statistics OS) :邻域中的数值仍然被排成序列,一个新的数值是该序列数值的线性组合。
非线性均值滤波(non-linear mean filter)
定义:
f(m,n)=u−1{∑(i,j)∈Oa(i,j)u[g(i,j)]∑(i,j)∈Oa(i,j)}
-
f(m,n)
是滤波的结果
-
g(i,j)
是输入图像的像素
-
O
是当前像素
(m,n)
的一个局部邻域
- 单变量函数
u
存在逆函数
u−1
-
a(i,j)
是加权系数
如果权
a(i,j)
是常数,滤波器被称为同态的(homonorphic)。同态滤波器
- 算术均值
u(g)=g
- 调和均值
u(g)=1g
- 几何均值
u(h)=log g
3.2 边缘检测算子
边缘检测算子(edge detectors)是一组用于在亮度函数中定位变化的非常重要的局部图像预处理方法,边缘是亮度函数发生急剧变化的位置。
边缘是赋给单个像素的性质,用图像函数在该像素一个邻域处的特性来计算。它是一个具有幅值(强度magnitude)和方向(direction)的矢量(vector variable)。
梯度的幅值|grad g(x,y)|和方向
ψ
|grad g(x,y)|=(∂g∂x)2+(∂g∂y)2−−−−−−−−−−−√
ψ=arg(∂g∂x,∂g∂y)
Laplacian 算子
我们只对边缘幅度有兴趣而不管其方向。Laplacian 是各向同性的,因此对图像中的旋转有不变性。
定义:
∇2g(x,y)=∂2g(x,y)∂x2+∂g2(x,y)∂y2
图像锐化(sharpening)
目标是使边缘更陡峭,锐化图像是供人观察的。
输出图像
f(i,j)=g(i,j)−CS(i,j)
C反映锐化强度正系数,S(i,j)是图像函数蜕化程度的度量。
非锐化屏蔽 (unsharp masking):常用于印刷行业。一个与非锐化图像成比例的信息必须从原始图像中减掉。
差分(differences)
图像
g
在纵向(固定i)和横向(固定j)的一阶差分如下
Δig(i,j)=g(i,j)−g(i−n,j)Δjg(i,j)=g(i,j)−g(i,j−n)
差分的对称表达:
Δig(i,j)=g(i+n,j)−g(i−n,j)Δjg(i,j)=g(i,j+n)−g(i,j−n)
梯度算子分类:
- 使用差分近似函数图像导数的算子。有些是具有旋转不变性的。
- 基于图像函数二阶导数过零点的算子
- 试图将图像函数与边缘的参数模型匹配算子
算子
Roberts算子: 只使用当前像素
2×2
邻域
卷积掩膜是
h1=[100−1]h2=[0−110]
边缘的幅值计算如下:
|g(i,j)−g(i+1,j+1)|+|g(i,j+1)−g(i+1,j)|
主要的缺点是对噪声的高度敏感性。
Laplace 算子: 通常使用
3×3
的掩膜
h
,对于4-邻接和8-邻接分别定义
h=⎡⎣⎢0101−41010⎤⎦⎥h=⎡⎣⎢1111−81111⎤⎦⎥
有时强调中心像素或其邻接性的Lapacian算子,这种近似不再具有旋转不变性。
h=⎡⎣⎢2−12−1−4−12−12⎤⎦⎥h=⎡⎣⎢−12−12−82−12−1⎤⎦⎥
缺点是:它对图像中的某些边缘产生双重响应。
Prewitt算子
对于
3×3
的卷积掩膜,在8个可能的方向上估计梯度,具有最大幅值的卷积给出梯度方向。更大的掩膜是可能的。
近似图像函数一阶导数的算子由于具有确定梯度方向的能力,有时称作罗盘算子(compass operators)
h1=⎡⎣⎢10−110−110−1⎤⎦⎥h2=⎡⎣⎢0−1−110−1110⎤⎦⎥h3=⎡⎣⎢−1−1−1000111⎤⎦⎥
梯度方向由具有最大响应的掩膜给出
Sobel算子
h1=⎡⎣⎢10−120−210−1⎤⎦⎥h2=⎡⎣⎢0−1−210−1210⎤⎦⎥h3=⎡⎣⎢−1−2−1000121⎤⎦⎥
Sobel 算子是通常用于水平和垂直边缘的一个简单检测子,这时使用
h1
和
h3
。如果
h1
的响应是
x
,
h3
的响应是
y
,可以得到强度(幅值)
x2+y2−−−−−−√或|x|+|y|
方向是
tan−1(yx)
Robinson 算子