数字图像处理知识点总结
1 Introduction
1.1 采样和量化
要把连续图像转为数字形式。图片的坐标和幅度都可能是连续的,需要采样。
- 采样:数字化坐标值。(位置)
- 量化:数字化幅度值。(颜色)
1.2 图像表示及存储格式
- 交叉存储:按[b,g,r]为一组存储
- 顺序存储:b,g,r分别存储,先存b值,后存g值,再存r值
存储结构体
struct Image {
int width, height; // 图像尺寸
int type; // 通道数、深度信息
void* data; // 图像数据
int step; // 步长(每行占用的字节数),每行指实际图片的一整行
};
Q:交叉存储,8位无符号,3通道数据,获取图像的
(x,y)
位置?32位带符号,3通道?(X正方向水平向右,Y正方向垂直向下,同数组方向)
A:
- img.data:数据,首地址
- img.step:图片一行的总字节数
- x,y:要获取的坐标位置
- img.data + y * img.step + x * 3 * 1(8b=1B)
- img.data + y * img.step + x * 3 * 4(32b=4B)
例题:
解答:(按字节和行列关系推导)
- (x,y): p + y * step + x * 3
- 上下左右(四邻域):
p-step; p+step; p-3; p+3
- 左上右上左下右下:
p-step-3; p-step+3; p+step-3; p+step+3
2 Fundamental
2.1 图像的像素灰度级变换
亮度 Intensity
数值整体变高,或整体变低
- Log变换: s = c l o g ( 1 + r ) s=clog(1+r) s=clog(1+r)
- Power-Law (gamma)变换: s = c r γ s=cr^\gamma s=crγ
对比度 Contrast
数值亮的更亮,暗的更暗,或反之。
2.2 直方图均衡化
直方图
直方图:统计每个灰度级的颜色分布。比如,0(黑色)出现的概率为p,255(白色)出现的概率为…
-
亮度低的直方图:
-
亮度高的直方图:
-
对比度低的直方图:
-
对比度高的直方图:
均衡化
直方图均衡化能增强对比度,把原图的直方图转为上述最后一张高对比度的直方图样式。
- 公式:
- 计算tips:
- 统计原图直方图(计算 p r p_r pr)
- 计算 T T T(累加起来,L表示灰度级,e.g. 256)。此处对小数的处理:四舍五入。
- 更新原图中的各个数值
2.3 插值
已知4个点( p 0 ( x 0 , y 0 ) , p 1 ( x 0 , y 1 ) , p 2 ( x 1 , y 0 ) , p 3 ( x 1 , y 1 ) p_0(x_0,y_0), p_1(x_0,y_1), p_2(x_1,y_0), p_3(x_1,y_1) p0(x0,y0),p1(x0,y1),p2(x1,y0),p3(x1,y1))的值,插值中间任意一点 p ( x , y ) p(x,y) p(x,y)
最近邻
选择最近一点
双线性
- 线性: p = ( 1 − u ) p 0 + u p 1 p= (1-u)p_0 + up_1 p=(1−u)p0+up1
- 双线性:两次x方向,1次y方向;或者2次y方向,1次x方向。
以两次x方向,1次y方向为例:- 两个X方向插值边缘: p ( x , y 0 ) = ( 1 − u ) p 0 + u p 1 p(x,y_0) = (1-u)p_0 + up_1 p(x,y0)=(1−u)p0+up1; p ( x , y 1 ) = ( 1 − u ) p 2 + u p 3 p(x,y_1) = (1-u)p_2 + up_3 p(x,y1)=(1−u)p2+up3
- 插值y方向: p ( x , y ) = ( 1 − v ) p ( x , y 0 ) + v p ( x , y 1 ) p(x,y) = (1-v)p(x,y_0) + vp(x, y_1) p(x,y)=(1−v)p(x,y0)+vp(x,y1)
双三次
三者的比较
- 最近邻:简单、快;但是未考虑周围灰度值变化,有明显的不连续性,图像质量损失较大。
- 双线性:计算量较大,克服了不连续性;未考虑各邻点的灰度值的相互影响,边缘会模糊
- 双三次:计算量很大;边缘会变平滑,图像质量较高
3 Spatial Filtering
3.1 平滑线性滤波器
- 均值滤波器
- 高斯滤波器
3.2 统计排序滤波器
- 中值滤波器:消除椒盐噪声(salt & pepper noise)
椒盐噪声:也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。
- 中值滤波时,噪声点很难被选上,所以能消除。
3.3 锐化空间滤波器
基本的高通滤波器
- 中间有正系数,边缘有负系数
- 总和为0
导数滤波器
f
′
(
x
)
=
f
(
x
+
1
)
−
f
(
x
)
f'(x) = f(x+1) - f(x)
f′(x)=f(x+1)−f(x)
f
′
′
(
x
)
=
f
(
x
+
1
)
+
f
(
x
−
1
)
−
2
f
(
x
)
f''(x) = f(x+1) + f(x-1) - 2f(x)
f′′(x)=f(x+1)+f(x−1)−2f(x)
G
=
∣
G
x
∣
+
∣
G
y
∣
G = |G_x|+|G_y|
G=∣Gx∣+∣Gy∣
二阶导 - laplacian
∂
2
f
∂
x
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
\frac{\partial ^2 f}{\partial x^2} = f(x+1, y) + f(x-1, y) - 2f(x, y)
∂x2∂2f=f(x+1,y)+f(x−1,y)−2f(x,y)
∂
2
f
∂
y
2
=
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
\frac{\partial ^2 f}{\partial y^2} = f(x, y+1) + f(x, y-1) - 2f(x, y)
∂y2∂2f=f(x,y+1)+f(x,y−1)−2f(x,y)
∇
2
f
=
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
\nabla^2 f = \frac{\partial ^2 f}{\partial x^2} + \frac{\partial ^2 f}{\partial y^2}
∇2f=∂x2∂2f+∂y2∂2f
将相应的(x,y)
对应到3*3算子上,填入相对应系数:
扩展另外4个角:
应用在原图上:
laplacian算子的应用实例:
一阶导 - sobel
f
′
(
x
,
y
)
=
f
(
x
+
1
,
y
)
−
f
(
x
,
y
)
f'(x,y) = f(x+1, y) - f(x, y)
f′(x,y)=f(x+1,y)−f(x,y)
f
′
(
x
,
y
)
=
f
(
x
,
y
+
1
)
−
f
(
x
,
y
)
f'(x,y) = f(x, y+1) - f(x, y)
f′(x,y)=f(x,y+1)−f(x,y)
- Robert先扩展,交叉的2*2算子
- Prewitt算子变为3*3(下图sobel中的2全是1)
- Sobel的3*3算子(此处省略:sobel的原理及更大的算子推导)
4 Frequency
4.1 傅里叶变换(FT)
傅里叶变换:能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。(此处会结合欧拉公式)
下文中,f(x)表示空域,F(u)表示频域。
- 空域->频域:傅里叶变换
- 频域->空域:傅里叶逆变换
一维连续傅里叶变换 f(x) -> F(u)
F
(
u
)
=
∫
−
∞
+
∞
f
(
x
)
e
−
j
2
π
u
x
d
x
F(u) = \int_{-\infty}^{+\infty} f(x) e^{-j2\pi ux} dx
F(u)=∫−∞+∞f(x)e−j2πuxdx
逆变换:
f
(
x
)
=
∫
−
∞
+
∞
F
(
u
)
e
j
2
π
u
x
d
u
f(x) = \int_{-\infty}^{+\infty} F(u) e^{j2\pi ux} du
f(x)=∫−∞+∞F(u)ej2πuxdu
一维离散傅里叶变换
F
(
u
)
=
1
M
∑
x
=
0
M
−
1
f
(
x
)
e
−
j
2
π
u
x
/
M
F(u) = \frac{1}{M} \sum_{x=0}^{M-1} f(x) e^{-j2\pi ux/M}
F(u)=M1∑x=0M−1f(x)e−j2πux/M
逆变换:
f
(
x
)
=
∑
u
=
0
M
−
1
F
(
u
)
e
j
2
π
u
x
/
M
f(x) = \sum_{u=0}^{M-1} F(u) e^{j2\pi ux/M}
f(x)=∑u=0M−1F(u)ej2πux/M
欧拉公式
e
j
θ
=
c
o
s
θ
+
j
s
i
n
θ
e^{j\theta} = cos\theta + jsin\theta
ejθ=cosθ+jsinθ
e
−
j
θ
=
c
o
s
θ
−
j
s
i
n
θ
e^{-j\theta} = cos\theta - jsin\theta
e−jθ=cosθ−jsinθ
二维连续与离散
- 连续: F ( u , v ) = ∫ x = − ∞ + ∞ ∫ y = − ∞ + ∞ f ( x , y ) e − j 2 π ( u x + v y ) d x d y F(u,v) =\int_{x=-\infty}^{+\infty} \int_{y=-\infty}^{+\infty} f(x,y) e^{-j2\pi (ux+vy)} dxdy F(u,v)=∫x=−∞+∞∫y=−∞+∞f(x,y)e−j2π(ux+vy)dxdy
- 离散: F ( u , v ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x ) e − j 2 π ( u x / M + v y / N ) F(u,v) = \frac{1}{MN} \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x) e^{-j2\pi (ux/M + vy/N)} F(u,v)=MN1∑x=0M−1∑y=0N−1f(x)e−j2π(ux/M+vy/N)
4.2 快速傅里叶变换(FFT)
- 普通的傅里叶变换(FT)需要 M 2 M^2 M2次的加法/乘法运算
- 快速傅里叶变换(FFT)只需要 M l o g 2 M Mlog_2M Mlog2M次运算
4.3 频域的高低通滤波器
应用步骤:
- 乘以 ( − 1 ) ( x + y ) (-1)^{(x+y)} (−1)(x+y):将低频移中
- 傅里叶变换:转为频率域F(u,v)
- 乘以滤波函数H(u,v)
- 傅里叶逆变换:转回空域f(x,y)
- 取4结果的实部
- 乘以 ( − 1 ) ( x + y ) (-1)^{(x+y)} (−1)(x+y)得到空域图像
理想高/低通滤波器
0/1:高低通
巴特沃斯高/低通滤波器
更加柔和
4.4 滤波器设计、卷积和相关性理论
Q: 频率域滤波相比较空间域滤波的计算效率与适用条件?
5 Morphology
5.1 膨胀与腐蚀
膨胀:A被B膨胀,平移B的反射,与A交集不为空
腐蚀:A被B腐蚀,平移B,完全包含于A
5.2 开操作与闭操作
开操作:先腐蚀再膨胀
- 使轮廓光滑,消除细的突出物
- 消除狭长的区域
闭操作:先膨胀再腐蚀
- 使轮廓光滑,消除小的孔洞,填补轮廓中的断裂
- 消除狭长的缝隙
6 Segmentation
6.1 基于亮度/颜色值
- 区域分割:只适用于灰度值,依赖于阈值的选择。(根据直方图直接取)
- K-Means:将每个颜色聚类起来,达到“分割”的效果
- 初始化K个中心点
- 计算距离,取最近分配为K个组
- 计算每个组新的平均值,更新中心点
- 迭代,直到达到停止条件(收敛或次数达到上限)
- Mean-Shift:求数据分布的密度峰值作为聚类中心,过程类似于爬山。划定一个区域,不断找到新的质心,移动区域,最终停止。一个参考视频
一般同时考虑坐标和颜色,即对
(r,g,b,x,y)
五维向量进行聚类
6.2 基于区域
- 区域生长:任取一个点,判断周围相似的点,不断向外扩张,停止后在未生长的区域重新扩张。相似:直接作差,小于一个阈值,则为相似。
- 区域分离与合并:先分离(按4个象限递归分),再合并(相邻区域,两两合并)
- 分水岭:
- 活动轮廓(snake)和水平集(level-set):
6.3 基于图
- 图切割:最大流最小割
- 测地距离:
- 随机游走:
传统图像分割算法与基于深度学习的图像分割算法的异同与各自的优缺点:
7 Deep Learning (CNN etc.)
7.1 深度学习基本
1. Batch normalization
过程
把
γ
\gamma
γ和
β
\beta
β都当作网络中的参数,一起训练
解决的问题及优势与好处
解决的问题:Internal Covariate Shift。一般解决方案:learning rate设置小一些,或者对多个layers做feature scaling(这就是Batch Normalization)
好处:
- 加快训练速度
- 可以使用更大的learning rate
- 提高网络中的gradient flow(less exploding/vanishing gradients)
- 减少初始化值的影响
- 分离权重向量的方向及其大小
- different at testing
2. Dropout
按一定概率丢弃神经元,避免overfitting
3. Data Augmentation
- 旋转
- 缩放
- 平移
- 拉伸
- 翻转
- …
4. 优化方法(SGD,Adam)
- GD(梯度下降):更新 θ \theta θ 计算梯度时,使用了所有数据的均值
- SGD:更新
θ
\theta
θ 计算梯度时,仅随机选取一个数据
θ j : θ j − α J ′ \theta_j : \theta_j - \alpha J' θj:θj−αJ′,其中 J ′ J' J′仅随机使用一个X计算,而GD使用了所有X计算。white True: dx = compute_gradient(x) x -= alpha * dx
- SGD+Momentum:增加一个动量
vx = 0 while True: dx = compute_gradient(x) vx = rho * vx + dx x -= alpha * vx
- Adam(自适应):
5. Back Propagation
基本原理:求导的chain rule
梯度消失(vanishing)与梯度爆炸(exploding)
- 梯度消失:在backpropagation计算导数时,网络越来越深,一堆小于1的值乘起来,越来越小,最后趋近于0
- 梯度爆炸:在backpropagation计算导数时,网络越来越深,一堆大于1的值乘起来,越来越大,最后趋近于 + ∞ +\infty +∞
如何避免:
- batch normalization
- 使用ReLU,Dropout
- 更好的初始化
- 更好的网络结构
7.2 CNN基本
多层感知机 Perceptron
略
卷积神经网络 CNN
- stride: 跳过几个像素平移filter
- padding: 在filter覆盖的角落部分,图像产生空余无像素区域,如何处理
- pooling 池化:把图像变小。Max-Pooling,取最大值
常用的CNN架构
- AlexNet
- VGG
- ResNet
- …