数字图像处理期末考试的重点知识点
主要来源于课程PPT
内容类似于提纲性质,不会太过完整介绍
考试题目整理:https://blog.csdn.net/i0o0iW/article/details/112472730
图像表示及存储格式
图像格式
JPG,PNG,GIF,BMP……
无损压缩:PNG
存储动画:GIF
存储透明图:GIF,PNG
图像存储
获取像素
已知像素p所在行列的坐标(x,y),写出p的八邻域坐标
(x-1,y-1) | (x-1,y) | (x-1,y+1) |
---|---|---|
(x,y-1) | p(x,y) | (x,y+1) |
(x+1,y-1) | (x+1,y) | (x+1,y+1) |
opencv中的左手坐标系:
已知P的内存地址ptr,求P的八邻域像素内存地址(8位3通道图像,step为一行的字节数)
ptr-step-3 | ptr-step | ptr-step+3 |
---|---|---|
ptr-3 | ptr | ptr+3 |
ptr+step-3 | ptr+step | ptr+step+3 |
对一个32位浮点型3通道图像(CV_32FC3),行宽为step, 如果一个像素地址为p,写出其上、下、左、右像素的地址
p-step | ||
---|---|---|
p-4*3 | p | p+4*3 |
p+step |
遍历像素
基本图像处理
灰度变换
遍历图像中的像素,逐像素的进行变换:
- 亮度调整Intensity Adjustment
- 对比度调整Contrast Adjustment
L
′
=
T
(
L
)
L
,
L
′
∈
[
0
,
255
]
L'=T(L) L,L' \in [0,255]
L′=T(L)L,L′∈[0,255]
亮度调整
对像素处理,使图像整体变量或者变暗
变换函数:
其中幂律变换的幂次影响如下:
对比度调整
对比度变换可以理解为对像素处理,使亮的更亮,暗的更暗(增大对比度)
变换函数:
对比度拉伸:
插值
以放大图像为例,放大后图像的坐标映射到原图上是一个非整数,则可以根据如下方法获取其像素值
最近邻
双线性插值
这两种方式是等价的
一次双线性插值最少需要3次乘法运算
float bilinear(float a, float b, float c, float d, float dx, float dy)
{
float h1=a+dx*(b-a); // = (1-dx)*a + dx*b
float h2=c+dx*(d-c);
return h1+dy*(h2-h1);
}
双三次插值
a,b,c,d的确定:
如何计算导数:
f
′
(
x
)
=
(
f
(
x
+
1
)
−
f
(
x
−
1
)
)
/
2
f'(x)=(f(x+1)-f(x-1))/2
f′(x)=(f(x+1)−f(x−1))/2
邻域
直方图
直方图:统计各个灰度级的像素在图像总像素中所占的比例绘制成的图像
直方图均衡化
直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰.
变换函数:
s
k
=
T
(
r
k
)
=
(
L
−
1
)
∑
j
=
0
k
p
r
(
r
j
)
=
L
−
1
M
N
∑
j
=
0
k
n
j
s_k = T(r_k) = (L-1)\sum_{j=0}^kp_r(r_j) = \frac{L-1}{MN}\sum_{j=0}^kn_j
sk=T(rk)=(L−1)j=0∑kpr(rj)=MNL−1j=0∑knj
例题:
p(0)=2/16=1/8,p(1)=3/16,p(2)=1/8,p(3)=1/8,p(4)=1/8,p(6)=1/8,p(8)=1/8,p(16)=1/16
T(0)=round(15*1/8)=2
T(1)=round(15*(1/8+3/16))=5
T(2)=round(15*7/16)=7
T(3)=round(15*9/16)=8
T(4)=round(15*11/16)=10
T(6)=round(15*13/16)=12
T(8)=round(15*15/16)=14
T(9)=round(15*16/16)=15
直方图规定化(直方图匹配)
直方图匹配要求实现:输出的图像具有规定的直方图的形状
z
=
G
−
1
[
T
(
r
)
]
=
G
−
1
(
s
)
z = G^{-1}[T(r)]=G^{-1}(s)
z=G−1[T(r)]=G−1(s)
拓展到离散域:
图像滤波、图像梯度
线性滤波
滤波可分为低通滤波和高通滤波;低通:平滑,高通:锐化
Smoothing Filter
均值滤波
输出图像每个像素是核窗口内对应范围的所有像素的均值
使用积分图快速均值滤波
void integral_image(const uchar *src, int width, int height, int sstride, int *pint, int istride)
{
int *prow=new int[width];
memset(prow,0,sizeof(int )*width);
for(int yi=0; yi<height; ++yi, src+=sstride, pint+=istride)
{
prow[0]+=src[0]; pint[0]=prow[0]; //for the first pixel
for(int xi=1; xi<width; ++xi)
{
prow[xi]+=src[xi];
pint[xi]=pint[xi-1]+prow[xi];
}
}
delete[]prow;
}
高斯滤波
使用高斯函数作为滤波核
σ \sigma σ的值越大,越趋向于均值滤波
二维高斯滤波可以分离成两个方向的一维高斯滤波
Sharpening Filters
模板特点:
- 滤波器应该在中心有正系数,而在边缘上有负的系数
- 总和为零
导数滤波器
一阶导:
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)
- 一阶导产生的边缘可以有较大的宽度,如斜坡具有持续的亮度,这对边缘位置的确定是不利的,因为在寻找边缘的时候,我们希望确定准确的边缘位置
- 二阶导在边缘处过零点,这是确定边缘的简单判别方式
- 二阶导对噪声敏感,因此一般的图像处理中的二阶导施行之前,需要对图像进行高斯滤波,先行去除噪声
梯度
Roberts Operators
Prewitt Operators
Sobel Operators
高斯滤波:消除噪音的同时也使边缘变得模糊;
Sobel算子:消除噪音的同时使边缘锐化。
Sobel算子是在一个坐标轴的方向上进行非归一化的高斯平滑,在另外一个坐标轴方向上进行差分处理。
PS:5阶Sobel算子
Laplacian
边界处理
- 边界填充
- 边界附近调整滤波核大小
非线性滤波
中值滤波
输出图像每个像素是核窗口对应范围内所有像素的中值
有利于去除椒盐噪声
最大(小)值滤波
同理于中值滤波
频域图像处理、傅里叶变换
频率即信号进行周期性变化的速率
图像的频率:图像亮度/颜色在水平/垂直方向上周期性变化的速率
梯度!=频率:梯度是信号在空间(时间)域的变化率;频率是信号周期的变化率
频率的描述
“某种频率的成分”,涉及两个关键问题:
-
确定“某种频率”:选择一组具有特定频率的信号(信号的基),且通过这组信号的组合可以表示其它任何的信号;
-
计算“频率的成分”:对任意的输入信号,以及某给定的基信号(频率已知),计算该基信号所占的成分(系数);
傅里叶变换
相关公式集合:
一维连续傅里叶变换:
F
(
u
)
=
∫
x
=
−
∞
+
∞
f
(
x
)
e
−
2
j
π
u
x
d
x
F(u)=\int_{x=-\infty}^{+\infty} {f(x)e^{-2j\pi ux}} \,{\rm d}x
F(u)=∫x=−∞+∞f(x)e−2jπuxdx
一维连续傅里叶逆变换:
f
(
x
)
=
∫
u
=
−
∞
+
∞
F
(
u
)
e
2
j
π
u
x
d
u
f(x)=\int_{u=-\infty}^{+\infty} {F(u)e^{2j\pi ux}} \,{\rm d}u
f(x)=∫u=−∞+∞F(u)e2jπuxdu
一维离散傅里叶变换:
F
(
u
)
=
1
M
∑
x
=
0
M
−
1
f
(
x
)
e
−
2
j
π
u
x
/
M
F(u)=\frac{1}{M}\sum_{x=0}^{M-1}f(x)e^{-2j\pi ux/M}
F(u)=M1x=0∑M−1f(x)e−2jπux/M
一维离散傅里叶逆变换:
f
(
x
)
=
∑
u
=
0
M
−
1
F
(
u
)
e
2
j
π
u
x
/
M
f(x)=\sum_{u=0}^{M-1}F(u)e^{2j\pi ux/M}
f(x)=u=0∑M−1F(u)e2jπux/M
二维连续傅里叶变换:
F
(
u
,
v
)
=
∫
x
=
−
∞
+
∞
∫
y
=
−
∞
+
∞
f
(
x
,
y
)
e
−
2
j
π
(
u
x
+
v
y
)
d
x
d
y
F(u,v)=\int_{x=-\infty}^{+\infty} \int_{y=-\infty}^{+\infty} {f(x,y)e^{-2j\pi (ux+vy)}} \,{\rm d}x\,{\rm d}y
F(u,v)=∫x=−∞+∞∫y=−∞+∞f(x,y)e−2jπ(ux+vy)dxdy
二维连续傅里叶逆变换:
f
(
x
,
y
)
=
∫
u
=
−
∞
+
∞
∫
v
=
−
∞
+
∞
F
(
u
,
v
)
e
2
j
π
(
u
x
+
v
y
)
d
u
d
v
f(x,y)=\int_{u=-\infty}^{+\infty} \int_{v=-\infty}^{+\infty} {F(u,v)e^{2j\pi (ux+vy)}} \,{\rm d}u\,{\rm d}v
f(x,y)=∫u=−∞+∞∫v=−∞+∞F(u,v)e2jπ(ux+vy)dudv
二维离散傅里叶变换:
F
(
u
,
v
)
=
1
M
N
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
f
(
x
,
y
)
e
−
2
j
π
(
u
x
/
M
+
v
y
/
N
)
F(u,v)=\frac{1}{MN}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-2j\pi (ux/M+vy/N)}
F(u,v)=MN1x=0∑M−1y=0∑N−1f(x,y)e−2jπ(ux/M+vy/N)
二维离散傅里叶逆变换:
f
(
x
,
y
)
=
∑
u
=
0
M
−
1
∑
v
=
0
N
−
1
F
(
u
,
v
)
e
2
j
π
(
u
x
/
M
+
v
y
/
N
)
f(x,y)=\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)e^{2j\pi(ux/M+vy/N)}
f(x,y)=u=0∑M−1v=0∑N−1F(u,v)e2jπ(ux/M+vy/N)
二维傅里叶变换行列分离:
F
(
u
,
v
)
=
1
M
N
∑
x
=
0
M
−
1
e
−
2
j
π
u
x
/
M
∑
y
=
0
N
−
1
f
(
x
,
y
)
e
−
2
j
π
v
y
/
N
F(u,v)=\frac{1}{MN}\sum_{x=0}^{M-1}e^{-2j\pi ux/M}\sum_{y=0}^{N-1}f(x,y)e^{-2j\pi vy/N}
F(u,v)=MN1x=0∑M−1e−2jπux/My=0∑N−1f(x,y)e−2jπvy/N
快速傅里叶变换FFT
对于傅里叶变换:
基本思想及推导
频率域图像滤波
- 对输入图像乘以(-1) (x+y)以对图像进行移中
- 对1的结果进行二维离散傅立叶变换(DFT),计算F(u,v)
- 对F(u,v)乘上滤波函数H(u,v)
- 对3的结果进行离散傅立叶逆变换
- 取4的结果的实部
- 对5的结果乘上(-1) (x+y)获得空域的滤波后图像
形态学图像处理
集合论基础知识
腐蚀
膨胀
膨胀的另一个定义:
下图可能更容易理解:
开操作
闭操作
图像分割
将图像/视频帧按照特定的目标或要求划分成子区域的操作。
E.G.
语义分割:将属于同一物体的像素聚合到一起
前景提取:将感兴趣物体(前景)与其他区域(背景)分离
基本方法
图像分割算法一般基于亮度值的两个基本特征之一
- 不连续性:图像边缘
- 相似性:阈值处理、区域生长、区域分离和聚合
基于相似性的分割
分类:
- 基于亮度/颜色分布的方法: 阈值分割、K-means (K-均值)、 Mean Shift (均值漂移)
- 基于区域的分割: 区域生长、区域分离与合并 、分水岭、活动轮廓(Snake)与水平集(Level-Set)方法
- 基于图的分割:Graph Cut (图切割)、Geodesic (测地距离)、 Random Walks (随机游走)
基于亮度/颜色分布的方法
阈值分割
对像素的亮度进行阈值化处理(利用亮度分布的不连续性)
关键在于阈值选择,可以根据直方图或者手工选择
图像的不同区域具有不同的亮度分布,因此全局阈值不一定能适合所有区域
局限性
- 阈值难以确定
- 仅适用于灰度图(1维空间),对彩色图像难以定义阈值
K-means
Mean Shift
- 无需指定类别个数,得到的类别个数等于找到的密度极大值个数
- 得到的类别个数取决于窗口大小(仍需手工指定)
基于区域的分割
区域生长
以一组种子点开始,将与种子点相似的相邻像素附加到生长区域的每个种子上
区域分离与合并
将图像任意分为一系列不相交的区域,将这些区域按照一定条件进行合并/或拆分
基于图的分割
图切割
随机游走
测地距离
卷积神经网络
Batch Normalization
Internal Covariate Shift
指在深层网络训练过程中,由于网络中参数变化引起内部节点数据分布发生变化
问题:
- 上层网络需要不断适应数据分布的变化,导致学习速率变慢
- 网络训练过程容易陷入梯度饱和,减缓网络收敛速度
Batch Normalization思路
- 既然数据分布发生了变化,那么就对输入的特征进行Normalization,使之具有均值为0,方差为1的分布就可以了
- 但这样改变了每一层的分布,从而改变了网络中数据的表达能力。所以BN对变换后的数据进行了一个线性变换操作,使之尽可能恢复本身表达能力
使用
Dropout
在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征
优化方法
SGD
每一次迭代计算mini-batch的梯度,然后对参数进行更新
问题:
- learning rate的选择
- 容易收敛于局部最优,可能会困在saddle points
SGD+Momentum
AdaGrad
AdaGrad其实对学习率进行了约束
- 代码中grad_squared较小的时候,后边约束项较大,能够增大梯度
- 较大的时候反之起到约束梯度的作用
- 但仍然需要人工设置学习率
- 后期约束项分母逐渐累积导致梯度趋近于0,step_size衰减趋近于0