修正补充说明: PPT上的傅里叶变换部分为主要修完善部分(我们补充了正确的答案)。因为原来的PPT有较多的数字错误和解题错误。 together with Liangxu Zhang
文章目录
综述
这是数字图像处理的课程知识点梳理。侵删。
课程讯息:
山东大学计算机学院2019年数字图像处理sd01331160。
联络:
sdudzy@163.com
All comments and supplements are well welcomed!
知识体系
- 图像表示及存储格式(交叉、顺序存贮)
- 基本的图像处理 ( 对比度增强 、 插值 、 邻域 )
- 直方图(图像均匀化,归一化)
- 图像滤波、图像梯度(Sobel,Laplacian)
- 频域图像处理、傅里叶变换等
- 形态学图像处理(膨胀和腐蚀,开闭操作等)
- 卷积神经网络
2019试题:CS and SE
All questions
PPT1
- 解释图像获取过程中的采样与量化
- JPG, PNG, GIF, BMP这几种图像格式中,哪些是无损压缩?哪些可以存贮动画?哪些可以存贮透明图?
- 对一个32位浮点型3通道图像(CV_32FC3),行宽为step, 如果一个像素地址为p,写出其上、下、左、右像素的地址。
PPT2
-
简述图像几何变换两种方式:正向投射和逆向查找的过程,并说明两种方式分别需要解决的关键问题。
-
三次插值和双线性插值相比,抗锯齿和马赛克的效果更好,请说明为什么。
-
已知两幅图像中的N个点对 ( p i , p j ) (p_i, p_j) (pi,pj),i=1,…,N, N>3, 请简述求两幅图像之间符合这N个点对约束的仿射变换A的方法。
PPT3
PPT4
-
设计5*5的Sobel梯度算子
-
根据Laplacian函数的定义,推导如下标准的Laplacian算子
-
图像的线性滤波是否是对图像的线性变换?可否表示成对图像的矩阵变换的形式?
PPT5
图像表示及存储格式
基本知识
什么是图像:
-
Digital Image
x , y , f ( x , y ) x, y, f(x, y) x,y,f(x,y) take only discrete values
Formed with finite elements -
Sampler and Quantizer
所谓采样,就是把一幅连续图像在空间上分割成M×N个网格,每个网格用一亮度值来表示。一个网格称为一个像素。M×N的取值满足采样定理。
量化就是把采样点上对应的亮度连续变化区间转换为单个特定数码的过程。量化后,图像就被表示成一个数字矩阵。每个像素具有两个属性:位置和灰度。
图像表示
- 具体例子:
图像的存储
什么是通道channel
一个三通道的400300的图,本质是一个4003003的一个矩阵
P
[
400
,
300
,
3
]
P[ 400, 300, 3]
P[400,300,3] 。说明这个图像有400列,300行,以及在色彩上有三个分量。每个分量单独拿出来都是一个400300(*1)的矩阵如你所见,它们并不是彩色的,而是一幅灰度图像对于一副8bit的图像来说,矩阵元素的取值范围是从0-255(0 - 2^8-1)矩阵中的元素对应我们所说的像素(pixel),其值即该像素的灰度值,数值越大,像素的颜色越‘白/浅’;数值越小,像素的颜色越’黑/深‘对于图像每个分量来说,它只是灰度,谈论色彩没有意义,它是“黑白”的!(用黑白来描述灰度图像并不准确,用深浅可能更准确一些,但也不严谨。所以我加上了引号。你要愿意把通道设成红色绿色紫色黄色都行)**在图像显示时,我们把图像的R分量放进红色通道里,B分量放进蓝色通道里,G分量放进绿色通道里。**经过一系列处理,显示在屏幕上的就是我们所看到的彩色图像了。
定义图像 [code]
step就是每行所占用的字节 = 8bit数。
获取像素 [code]
如果是 n位带符号,m通道数据就是
return (int*)( (char*)img.data+y*img.step+x*m*(n/8) );
ROI为:representing sub-region (ROI)。
遍历像素 [code]
遍历ROI的pixel [code]
注意这里需要用到两个function:scanpixel \ getpixel。
基本的图像处理
How to describe a pixel?
- Spatial coordinate (x, y)
- Pixel color(RGB, YUV, …)
- (x, y, R, G, B)
对于(x,y)而言我们是:Geometric processing。
对于pixel color(RGB, YUV, …)我们是:Algebraic processing。
Gray level transformation(灰度变换)
Processing pixel-by-pixel, and do transform to the gray level of each pixel:
- Intensity Adjustment (亮度调整)
- Contrast Adjustment (对比度调整)
Gray_transform灰度变换 [code]
Intensity Adjustment
可以理解为对pixel的处理整体变亮或者变暗。
左边变亮;右边变暗。
变换函数:
Power-law中 gama 的影响:
Contrast Adjustment
Highlighting specific Gray-Level
有两种方式可以完成:
效果:
Bit-plane Slicing
解释一下:
通常Pixel都是8bit组成的,有256种变化。对每位bit他们的信息重要性是不一样的。高位的信息更重要。
代数运算
前提条件:
输入为多幅大小相同的图像
输出图像与输入图像大小相同
基于对应像素进行计算
- 基本操作:and or xor 等
注意这里都是基于0-1的二值图像。
- Alpha blending
每个像素中有红R、绿G、蓝B三组数值。若环境中允许像素能拥有一组α值,我们就称它拥有一个α通道。α值的内容,是记载像素的透明度。这样一来使得每一个物件都可以拥有不同的透明程度。
例如一个 alpha = 0.2 的颜色,就可以将其想像为透光率为 80% 的彩色玻璃。我们透过这块玻璃看去,由于 80% 的光都透过了,因此留下来的颜色只剩 20%,即所谓 0.2 的 alpha。
所谓 Alpha-Blending,其实就是按照“Alpha”混合向量的值来混合源像素和目标像素。
设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明).
Alpha混合公式如下:
R
(
C
)
=
(
1
−
a
l
p
h
a
)
∗
R
(
B
)
+
a
l
p
h
a
∗
R
(
A
)
G
(
C
)
=
(
1
−
a
l
p
h
a
)
∗
G
(
B
)
+
a
l
p
h
a
∗
G
(
A
)
B
(
C
)
=
(
1
−
a
l
p
h
a
)
∗
B
(
B
)
+
a
l
p
h
a
∗
B
(
A
)
R(C)=(1-alpha)*R(B) + alpha*R(A) \\ G(C)=(1-alpha)*G(B) + alpha*G(A)\\ B(C)=(1-alpha)*B(B) + alpha*B(A)\\
R(C)=(1−alpha)∗R(B)+alpha∗R(A)G(C)=(1−alpha)∗G(B)+alpha∗G(A)B(C)=(1−alpha)∗B(B)+alpha∗B(A)
R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。一般来说A为前景,B为背景。
-
Image Matting
左边是合成图像位置 i 的 RGB 值,右边是前景和背景RGB的线性组合。alpha 是未知的。对于每个像素,有3个已知量(C的RGB),7个未知量(A、B的RGB以及alpha),所以这个一个 underconstrained 问题,即变量个数大于方程个数。 -
背景相减
根据阈值不同:
基本几何处理
水平&垂直翻转 (flip)
缩放 ( resize / zoom in /zoom out /scale)
旋转 (rotation)
……
仿射变换 (Affine Transform)
透视变换 (Perspective Transform)
……
图像变形 (Image Warping)
水平&垂直翻转 (flip)
Vertical flip [code]
Horizontal flip [code]
Resizing(插值)
基于邻近像素的值,计算非整数位置上的颜色值
1.最近邻 (Nearest Neighbor)
2.双线性插值 (Bilinear Interpolation)
3.双三次插值 (Bicubic Interpolation)
最近邻 (Nearest Neighbor)
双线性插值 (Bilinear Interpolation) [code]
首先白色点、然后蓝色点。
一次双线性插值最少需多少次乘法运算?
看似6次
实际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);
}
双三次插值 (Bicubic Interpolation)
双三次插值:有问题的。
如何识别abcd。
错误的做法:
正确的做法:
如何计算导数:
我们如果只看一次cubic插值。其实三次cubic插值是hermite插值的一种情况:
Rotation
在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)旋转θ角度后,新的坐标设为(x, y)的计算公式:
x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ;
y= (x1 **- x2**)\*sin(θ) + (y1 **- y2**)\*cos(θ) **+ y2**;
操作
- 对比
刚性变换(Rigid Transformation)
只包含平移和旋转
保持物体的形状(保角)和尺寸
相当于正交变换
相似变换(Similar Transformation)
只包含平移、旋转和等比缩放
保持物体的形状
估计图像之间的仿射变换
how to solve the transformation?
至少三个不同线的平面点或者更多。
注意这里是
θ
=
(
1
−
r
)
2
\theta=(1-r)^2
θ=(1−r)2
直方图与图像统计
数学化定义:简而言之:一幅图像其实是一个二维的matrix,那么这个matrix每个位置[i,j]必定对应一个[0,255]的灰度值(灰度值扔到不同颜色的通道里就可以得到色彩)。假设这个时候图像对应的灰度级为[0,L-1],那么直方图其实就是这样的一个函数:
获得直方图的实现代码:
直方图的实现代码 [code]
实际效果:
- 在较暗的图中,直方图的组成成分集中在灰度级低的一侧
- 在比较亮的图中,直方图的组成成分集中在了灰度级高的一侧
- 在低对比度的图中,直方图窄而且集中在中间的区域
- 在高对比度的图中,直方图覆盖了灰度级很宽的范围,而且像素的分布没有太不均匀
Histogram Equalization 直方图均衡化
“如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。”
如何实现?
首先我们将原图像直方图标准化以得到原图像的PDF(概率分布函数):P(f)。
简单的来看, P ( r k ) P(r_k) P(rk)其实表达了某种概率的形式,那么结合等号后面的内容,我们看得出来,他表示的是灰度级为 r k r_k rk的像素占总的像素个数的比例。
个人认为之所以不是直接用k而是用r_k是因为,我们从0~k-1级的灰度值可能并不是连续的离散数值。比如 k = 0 , 1 , 2 r k = 10 , 20 , 30 k =0,1,2 ~ r_k =10,20,30 k=0,1,2 rk=10,20,30。
此时我们有
上面的意思其实就是我们期待对
r
k
r_k
rk有这样一个变换使得:
假设现在有一个变量r,表示原始图像的灰度级,并且已经被归一化到了[0,1]的区间。
有一个如下的变换函数:
s
k
=
T
(
r
)
=
∑
j
=
0
k
p
r
(
r
j
)
s_k = T(r) = \sum^k_{j=0}p_r(r_j)
sk=T(r)=∑j=0kpr(rj)(注意这是离散版本的积分)
s表示变换后的灰度值
T
(
r
)
T(r)
T(r)应满足如下两个条件:
在区间[0,1]上单值且单调递增
在[0,1]的区间内,
T
(
r
)
∈
[
0
,
1
]
T(r) \in [0,1]
T(r)∈[0,1]
- 在[0,1]上单值,其实是为了在做图像复原的时候,保证反变换存在
- 单调递增是为了使得变换后的图像和原图像之间具有保序性,防止输出的图像黑白颠倒
- 让其值都定在[0,1]之间是为了,让输入和输出都在同一个范围内变换,方便比较
下面是具体推导:
观察此时
p
s
(
s
)
p_s(s)
ps(s): 一个随机变量的概率密度函数满足在某个有限区间内为常数,而在这个区间以外为0,那么就说这个随机变量满足均匀分布。
[reference url is added to REF section]
具体的推导:
所以简单来说就是我们得到了归一化直方图的概率积分函数。
下面是一个例子:
Histogram matching (or histogram specification)
Local Enhancement
之前的变换都是基于全局性(基于整个图像)的,我们这里基于部分区域(邻域)的。但是注意我们依然是对整个图像进行处理,这个思想有点像卷积。
是不是和卷积示意图有点像?
Enhancement Using Histogram Statistics
直方图 More Operations
图像几何结构
- 像素邻域
区域增长与快速连通域算法
代码实现:
Two-Pass(两遍扫描法)
[ref can be found in REF section]
两遍扫描法,正如其名,指的就是通过扫描两遍图像,就可以将图像中存在的所有连通区域找出并标记。思路:第一遍扫描时赋予每个像素位置一个label,扫描过程中同一个连通区域内的像素集合中可能会被赋予一个或多个不同label,因此需要将这些属于同一个连通区域但具有不同值的label合并,也就是记录它们之间的相等关系;第二遍扫描就是将具有相等关系的equal_labels所标记的像素归为一个连通区域并赋予一个相同的label(通常这个label是equal_labels中的最小值)。
下面给出Two-Pass算法的简单步骤:
(1)第一次扫描:
访问当前像素B(x,y),如果B(x,y) == 1:
a、如果B(x,y)的领域中像素值都为0,则赋予B(x,y)一个新的label:
label += 1, B(x,y) = label;
b、如果B(x,y)的领域中有像素值 > 1的像素Neighbors:
1)将Neighbors中的最小值赋予给B(x,y):
B(x,y) = min{Neighbors}
2)记录Neighbors中各个值(label)之间的相等关系,即这些值(label)同属同一个连通区域;
labelSet[i] = { label_m, …, label_n },labelSet[i]中的所有label都属于同一个连通区域(注:这里可以有多种实现方式,只要能够记录这些具有相等关系的label之间的关系即可)
(2)第二次扫描:
访问当前像素B(x,y),如果B(x,y) > 1:
a、找到与label = B(x,y)同属相等关系的一个最小label值,赋予给B(x,y);
完成扫描后,图像中具有相同label值的像素就组成了同一个连通区域。
滤波操作(空间域滤波)
低通滤波有:线性的均值滤波器、高斯滤波器,非线性的双边滤波器、中值滤波器;
高通滤波有基于Canny,Sobel等各种边缘滤波。
低通滤波和高通滤波其实是相互矛盾的,但很多时候在做边缘检测前我们又需要进行低通滤波来降噪,这里就需要调节参数在保证高频的边缘不丢失的前提下尽可能的多去除图片的噪点。
线性滤波
空间域滤波器分为线性的和非线性的。我们首先介绍线性的:
Smoothing filter
所以其实low-pass filter做的就是 模糊或者平滑光顺的操作。
Some examples:
所以这里其实-a到a,-b到b刻画了一个滤波核。
注意: Mask size增加你的 blurring效果增加。
对于边界的处理,其实在DNN中,可能直接就补0 padding了。
积分图
基础版的积分图
进阶版积分图
因此,对一张WH的图像直接求取积分图,只需要:
(W-1)+(H-1)+2(W-1)*(H-1)
积分图代码实现 [code]
- 高斯滤波
sharping filter
锐化滤波器其实多种实现方式: 对于一般的其实就是高通滤波器。当然如果是低通滤波器其实做的工作是平滑。
高通滤波器
所以其实 high-pass filter是用于检测尖锐部分的。
注意对于5*5的滤波核,里面的一圈是正1,外面的一圈是-1。
Derivative Filters
这三种常见的算子还是要掌握的。
前面这个是 row fraction, 后面是Column fraction。
- 二阶
注意他其实是二阶导数和的形式:
我们下面将上面的算式写作算子:
拉普拉斯的问题在于:在你检测边缘的时候容易受到噪声的干扰。所以检测出来的边缘其实噪声也被放大了。
High-Boost Filtering 高频补偿滤波器
这个可以表示为与A有关的控制参数,进而控制滤波效果。
一个推导过程:
如果是A=1就是一般的高频滤波。
如果A越大 图像越亮:
Summary:
空间域滤波器分为线性的和非线性的。下面是非线性的:
非线性滤波器
Order statistic filter
中值滤波:
这里的意思好像是在一个邻域内将中间的数值使用周围(这里定义为5)最大的替代。
Bilateral filter
Wiener filter
ppt没有介绍。
Least square filter
ppt没有介绍。
图像的频率方法分析
频率:s频率即信号进行周期性变化的速率。
图像的频率:图像亮度/颜色在水平/垂直方向上周期性变化的速率。
梯度和频率是不一样的:梯度是信号在空间(时间)域的变化率。频率是信号周期的变化率。梯度!=频率
实际信号一般都是多种频率信号的叠加,因此不能简单地说其“频率是多少”,而应是“某种频率的成分是多少”。
关于傅里叶变换这有一个粗糙的笔记:
全体公式:
离散傅里叶
傅里叶级数和变换不一样:
- 傅立叶级数:一个周期函数可以表示为不同频率的正弦/余弦函数乘以不同系数的和(傅立叶级数)
- 傅立叶变换:非周期函数也可以表示为一组正弦/余弦的积分乘以权函数
实例:
修正
复数的模:将复数的实部与虚部的平方和的正的平方根的值,记作∣z∣
基本属性
二维傅立叶变换(2-D FT)的性质
- 平移 Translation
- 分配律与缩放 Distributivity and Scaling
- 旋转 Rotation
- 周期性与共轭对称性 Periodicity and Conjugate Symmetry
- 可分离性 Separability
移中操作
平移操作
前述方程意味着:
- f(x,y)乘以指数项,再进行傅立叶变换,则将频域原点移至 (u0,v0).
- F(u,v)乘以指数项,再进行傅立叶逆变换,则将空域的原点移至 (x0,y0).
- f(x,y) 的平移不影响傅立叶变换的幅度.
结果对比:
运算律
some examples:
快速傅里叶变换
需求原因
根据傅里叶变换的行列可分离性,二维傅里叶变换可由连续2次一维傅里叶变换得到——只需考虑一维的情况。
基本思想
推导过程
具体地,这里其实是折半引理:
注意这里其实是对原来的指数部分进行替换:
注意:
上面变化更加具体的说明:
基本算例
所以这里有:
频率域图像滤波
Notch filter
Low-pass filter & High-pass filter
卷积理论
有空间
与空间域行为不同:
理想低通滤波器平滑处理的边缘清晰,但在处理过程中会产生较严重的模糊和振铃现象,D0越小,这种现象越严重。
- how to get cutoff-frequency?
- 理想低通滤波
- 巴特沃斯滤波器
- 高斯低通滤波器
D越小越模糊:
- 拉普拉斯
图像修复
噪声模型
只存在噪声的空间域图像复原
只存在噪声的频率域图像复原
前面滤波器设计并没有考虑图像中的一点对于其他点的特 征有什么不同。
自适应、局部噪声消除滤波器
自适应滤波器,它们的行为变化基于由 矩形窗口定义的区域内图像的统计特征。
自适应滤波器要优于迄今为止讨论过的所有滤波器的性能。但自适应滤波器的复杂度提高了。
- 自适应中值滤波
估计退化函数的三个准则
- 观察
- 实验
- 数学建模
颜色
颜色空间
颜色恒常性是指当照射物体表面的颜色光发生变化时,人们对该物体表面颜色的知觉仍然保持不变的知觉特性。比如用红色照射白色的物体表面,我们看到的不是红色,而是在红光照射下的白色。
形态学图像处理
- 用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具
- 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的
- 形态学图像处理的数学基础和所用语言是集合论
- 形态学图像处理的应用可以简化图像数据,保持它们基本的形状特性,并除去不相干的结构
- 形态学图像处理的基本运算有4个:膨胀、腐蚀、开操作和闭操作
集合论基础
膨胀和腐蚀:产生滤波器作用
腐蚀的时候只保留那些全部包含于原来形状的信息。
开操作和闭操作:产生滤波器作用
先用B进行腐蚀,然后再用B进行膨胀。
形态学的主要应用
边界提取
图像分割
图像分割基本方法:
图像分割算法一般基于亮度值的两个基本特征之一
- 不连续性:图像边缘
- 相似性:阈值处理、区域生长、区域分离和聚合
基于相似性的分割 - 基于亮度/颜色分布的方法: 阈值分割、K-means (K-均值)、 Mean Shift (均值漂移)
- 基于区域的分割: 区域生长、区域分离与合并 、分水岭、活动轮廓(Snake)与水平集(Level-Set)方法
- 基于图的分割:Graph Cut (图切割)、Geodesic (测地距离)、 Random Walks (随机游走)
基于亮度/颜色分布的方法
-
阈值分割
-
K-means (K-均值)
-
Mean Shift (均值漂移)
基于聚类的方法:
基于区域的分割方法 -
区域生长
-
区域分离与合并
-
分水岭
终止条件:n = max+1
改进: -
对图片进行预处理
-
分割时添加约束
-
分割后对图像进行再处理
-
主动轮廓(Active Contour, Snake)与水平集(Level-Set)方法
水平集(Level-Set)方法
基于图的分割方法
-
图切割 (Graph Cut)
-
随机游走(Random Walks)
-
测地距离(Geodesic Distance)
DL
SGD:由于批梯度下降每跟新一个参数的时候,要用到所有的样本数,所以训练速度会随着样本数量的增加而变得非常缓慢。随机梯度下降正是为了解决这个办法而提出的。它是利用每个样本的损失函数对θ求偏导得到对应的梯度,来更新θ。
例如一般的梯度下降:
随机梯度下降:在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问题,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。但是相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是我们可以接受的,所以这个方法用的也比上面的多。下图是其更新公式:
pls just refer to the PDF.
Ref
- https://blog.csdn.net/aa93226aa/article/details/54600265
- https://blog.csdn.net/xhhjin/article/details/6445460
- https://www.zhihu.com/question/21849710/answer/19529410
- https://blog.csdn.net/guyuealian/article/details/78288131
- https://blog.csdn.net/jia20003/article/details/52710751
- https://blog.csdn.net/qq_38131594/article/details/80722928
- https://blog.csdn.net/liangchunjiang/article/details/79431339
- https://blog.csdn.net/bitcarmanlee/article/details/79147113
- https://www.zhihu.com/question/264189719/answer/291167114