第一章 概述
1.1 什么是数字图像?
图像分为两大类:模拟图像与数字图像
- 模拟图像:通过某种物理(光、电)的强弱变化来记录图像上各个点的亮度信息
- 连续:从空间上和数值上是不间断的
- 举例:胶卷照片、纸质照片、肉眼看见的图像
- 数字图像:模拟图像经过采样和量化后得到的图像
- 数字化意味着数字图像只是真实图像的近似,在数字化过程有信息损失(是为了方便计算机处理才做的采样和量化)
- 举例:数码相机储存的图像
- 像素值通常表示灰度、颜色、不透明度等
1.2 什么是数字图像处理?
数字图像处理是数字信号处理理论的二维扩展
两个主要任务:
- 改进图像质量,方便人们理解图像(从人的角度)
- 处理图像数字以方便机器存储、传输和表示图像,促进机器自动理解图像(从机器的角度)
特点:
- 处理信息量大
- 占用频带较宽
- 像素相关性大
- 受人因素影响较大
图像频率的定义:在图像处理中,频率指单位空间内完成周期性变化的次数,即空间频率。
1.3 数字图像处理研究的主要内容
1.4 数字图像处理的经典应用
- 天文
- 遥感
- 医学图像处理
- 天气预报
- 工业检测
- 执法
- 生物识别
- 智能检测
- 人机接口
- 图像增强
- 图像拼接
- 图像检索
可见光范围在400~760纳米之间
1.5 数字图像处理的发展趋势
Ø 从低分辨率向高分辨率发展
Ø 从二维(2D)向三维(3D)发展
Ø 从静止图像向动态图像发展
Ø 从单态图像向多态图像发展
Ø 从图像处理向图像理解发展
第二章 基础知识
2.1 图像的数字化
- 采样 →M*N矩阵
- 量化→连续函数f(x,y)被划分为K个空间
- 采样及量化越精细(M,N,K越大),越逼近连续图像
空间分辨率:对图像中可辩别的最小细节的度量(dpi)
灰度分辨率:可辩别的最小灰度变化(bits)
- 非均匀采样:根据图像内容来调整采样频率,在细节较多的地方精细采样,在平滑的区域进行粗糙采样。
- 非均匀量化:对像素出现频度低的部分量化间隔取大,而对频率高的部分量化间隔取小。
- 存在的问题:每个像素代表的面积不相等
例题
图像出现马赛克是由于采样间隔太大导致的√
图像出现伪轮廓是由于量化层次太少导致的√
在非均匀采样和量化的过程中,灰度变化平缓的区域采样频率应______,量化等级间隔_______。
取小;取小
2.2 图像的表示
- 图像的数学模型(模拟和数字)
任意一幅图像,根据它的光强度(亮度、密度或灰度)的空间分布,均可以用下面函数形式来表达
I = f ( x , y , z , λ , t ) I = f(x,y,z,λ,t) I=f(x,y,z,λ,t)
xyz是空间坐标,λ是波长,t是时间轴
非发光物体的光强度表示: f ( x , y ) = i ( x , y ) r ( x , y ) f(x,y) = i(x,y)r(x,y) f(x,y)=i(x,y)r(x,y)
f ( x , y ) f(x,y) f(x,y):像素点(x,y)的光强度
i ( x , y ) i(x,y) i(x,y):在点(x,y)出的光照强度
r ( x , y ) r(x,y) r(x,y):在点(x,y)出的反射率
2.3 图像模式及彩色模型
图像模式:
- 二值图像
- 灰度图像
- 彩色图像
常用的彩色模型:
- RGB彩色模型
- HSI彩色模型
- HSV彩色模型
- HSB彩色模型
- YCrCB模型
- Lab彩色模型
Hue(色度):定义纯色
Saturation(饱和度):纯色被白光稀释的程度
Value(亮度):颜色的亮度
RBG模型转HSV模型
2.4 像素之间的关系
领域、邻接、连通
像素点之间的距离
单独的像素点灰度值不能反映图像的空间结构,因此需要分析邻域像素点之间的关系来了解图像的局部结构。
为了确定两个像素是否连通,需确定其是否邻接
-
4邻域
-
对角邻域
-
8邻域
邻接:如果两个像素点p,q满足以下两个条件,则称它们是邻接的:
- 它们是邻域
- 它们的灰度值满足相似性准则
- 4邻接
- 8邻接
- m邻接(混合邻接):当同时存在4邻接和8邻接时,优先采用4邻接,屏蔽8邻接
连通:如果存在一个长度为n的通路,在通路中,每两个相邻的像素都是邻接的,那么起点到终点是连通的。
- 4连通
- 8连通
- m连通
像素点之间的距离
-
欧氏距离
-
D4距离
-
D8距离
-
Dm距离:像素点之间最短的m连通路长度
2.5 直方图
灰度直方图:统计在图像中具有该灰度值的像素个数出现的频数,并绘制成的图形。
归一化直方图:p(k)=nk/n
像素出现的频数= 灰度级为k的像素点个数/总像素个数
直方图是一阶统计特征,未反映相邻点之间的关系,即丢失了空间信息
图像与直方图间是不可逆变换
2.6 图像质量评价
-
主观评价:以人作为观测者,对图像进行主观评价,力求真实反映人的感知。建立在统计意义上,参加评价的观察者应该足够多。分为两种:
-
绝对评价:全优度尺度
-
相对评价:群优度尺度
-
-
客观评价:无人参与,借助某种数学模型,给出基于数字计算的结果来反映图像质量
- 均方误差MSE
- 信噪比SNR
- 峰值信噪比PSNR
- 平均绝对误差MAE
- 结构相似性SSIM
MSE的值越小,表明图像质量越好(M、N为图像的行列数)
信噪比SNR
PSNR值越大,表明待评图像与参考图像之间的失真较小,图像质量较好(单位是分贝,信号与噪声的比例)
第三章 图像增强
图像增强的特点
- 不能增加原始图像的信息,只能增强对某种信息的辨别分析能力
- 让图像更加有用,增强后图像不一定趋向原清晰图像
图像增强的工作包括:
- 突出图像中有趣的细节
- 去除图像的噪音
- 使图像更具视觉吸引力
图像增强技术上分为两大类:
- 空域图像增强:直接对像素值进行操作
- 频域图像增强:对图像的傅里叶变换或小波变换进行操作
3.1 点运算
特点:
- 只跟像素点自身灰度值有关,与邻域像素点灰度值无关
- 仅改变像素点的灰度值,不改变空间坐标
3.1.1 灰度变换
灰度变换用以下函数表示:
s
=
T
(
r
)
s = T(r)
s=T(r)
线性灰度变换–图像反向:
s
=
255
−
r
s = 255 - r
s=255−r
线性灰度变换–阈值化:
s
=
{
1.0
r
≥
k
0.0
r
<
k
s = \begin{cases} 1.0 & r≥k \\ 0.0 & r<k \end{cases}
s={1.00.0r≥kr<k
线性灰度变换–全局线性变换
s
=
A
r
+
B
s = Ar +B
s=Ar+B
线性灰度变换–分段线性变换
线性灰度变换–位平面切片
位平面切片技术常用于图像压缩,由于高阶位平面图包含了图像的主要信息,因此人们可以利用若干个高阶位平面图来重构灰度图像
线性变换在降低或提高亮度同时,会将许多本身灰度值较低或高的细节信息丢失
非线性变换:对不同的灰度值,采取不同的变换斜率
非线性灰度变换–对数变换(常用于增强图像中较暗部分)
对数变换的一般公式:
s
=
a
+
c
×
l
o
g
(
r
+
1
)
s = a + c × log(r+1)
s=a+c×log(r+1)
作用:对暗区进行拉伸,对亮区进行压缩,图像整体变亮。增强一幅图像中较暗的部分
常用领域:
对数变换常用于增强一幅图像中比较暗的部分,广泛用于频谱图像的显示中。傅里叶变换的频谱动态范围可能宽达0-106,直接显示频谱往往会丢失大量的细节。
非线性灰度变换–幂次变换:
s
=
c
∗
r
γ
s = c*r^γ
s=c∗rγ
γ>1:对高灰度值拉伸,压缩暗区,图像整体变暗
γ<1:对低灰度值拉伸,压缩亮区,图像整体变亮
非线性灰度变换–gamma校正
计算公式:输出亮度 = 输入亮度^(1/gamma),gamma取值在2.2到2.4之间
液晶电视机显示器的亮度比较高,为了增加液晶电视机显示器的透亮度,更好地表现颜色,需要通过对液晶电视机显示器进行GAMMA校正来完成。校正GAMMA曲线后,可以实现如下目的:暗场灰阶的颜色明显改善,各灰阶的颜色误差明显减少,暗场颜色细节分明,图像亮度颜色一致,透亮度好,对比明显。同一尺寸不同屏的电视对颜色表现的明显一致
3.1.2 直方图修正法
很多情况下,图像的灰度级集中在较窄的区间,引起图像细节模糊。通过直方图处理可以明晰图像细节,突出目标物体,改善亮度比例关系,增强图像对比度。直方图处理基于概率论
直方图均衡化可实现图像的自动增强,但效果不易控制,得到的是全局增强的结果。
直方图规定化可实现图像的有选择增强,只要给定规定的直方图,即可实现特定增强的效果。。
直方图均衡化(掌握)
直方图是统计每个灰度级上拥有的像素个数,而灰度变换仅仅改变的像素上的灰度值。因此变换前后阴影部分的面积相等,即变换像素的总个数相等。
由灰度变换前后后直方图阴影面积相等的特性得出以下积分相等,继而可以推导出:
推导结论说明:灰度变换后图现直方图是变换前直方图与变换函数导数之比
得到两个直方图与灰度变换函数之间的关系后,需要探究的则是如何得到这个能实现均衡化的灰度变换函数
由于均衡化最理想的效果是每个灰度级会拥有相同的像素个数,那么均衡化后直方图应为常数,即图像总像素A0/灰度级Dm。因此再进行两边积分,即可获得实现均衡化的灰度变换函数。
计算例题1
法2:利用离散的累计分布函数做变换函数(CDF)做变换函数
操作步骤:
1.归一化的输入图像灰度级
2.统计图像中各灰度级像素的个数nk
3.统计各灰度级的概率
4.计算各灰度级的累计分布函数
5. 量化:寻找与sk最接近的一个rk
6. 映射:原灰度级rk变换为量化后sk
直方图均衡化的优点是能够增强整个图像的对比度。
其缺点主要包括:
1.增强效果不易控制,处理的结果总是得到全局均匀化的直方图。
2.均衡化图像的动态范围扩大,本质上是扩大了量化间隔,但量化级别(灰度级)
可能减少了,导致某些图像细节消失。
3.对于直方图存在高峰的图像,经处理后对比度可能过分增强。
4.原来灰度值不同的像素经过处理后可能变为相同,从而形成一片灰度值相同的区
域,各区域之间有明显的边界,导致出现伪轮廓。
直方图规定化(拓展)
直方图规定化的基本思想:能够人为地修正直方图的形状,使之与期望的形状相匹配,
直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择性地控制直方图,使原始图像的直方图变成规定的形状,从而弥补了直方图均衡不具备交互作用的特性。
3.2 代数运算
加法运算
C
(
x
,
y
)
=
A
(
x
,
y
)
+
B
(
x
,
y
)
C(x,y) = A(x,y)+B(x,y)
C(x,y)=A(x,y)+B(x,y)
求多幅图像的均值可以去除叠加性噪声
广泛应用于视频图像中,不同时间拍摄的图像,用于求平均的图像数量N越大,去噪效果越好
减法运算
C
(
x
,
y
)
=
A
(
x
,
y
)
−
B
(
x
,
y
)
C(x,y) = A(x,y)-B(x,y)
C(x,y)=A(x,y)−B(x,y)
乘法运算
C
(
x
,
y
)
=
A
(
x
,
y
)
×
B
(
x
,
y
)
C(x,y) = A(x,y)×B(x,y)
C(x,y)=A(x,y)×B(x,y)
3.3 邻域运算
自然图像中各个像素并不是独立存在的,而且像素之间的相关性很大。据统计相邻像素点的灰度值相似度达到90%以上。
自然图像相邻像素点的 高相关性意味着:
1.人们可以根据像素点的灰度值推测出其邻域像素点的灰度值
2.图像信息具有冗余,可以压缩图像
邻域运算的操作步骤:
1.将模板在图像中漫游,并将模板中心与某像素重合,一次得到一个像素点的灰度值;
2.将模板上各单元的权值与模板下对应的像素点灰度值相乘;
3.将所有乘积相加;
4.将累加的结果作为灰度值赋予邻域中心所对应的像素。
5.模板在图像上滑动,邻域运算的过程会不断地重复,将更新所有像素点的灰度值。
空域滤波:就是在空间坐标域使用邻域运算完成的图像处理。
空域滤波分类:
- 平滑滤波
- 锐化滤波
3.3.1 图像平滑
均值滤波
1.均值滤波的模板各单元具有相同的权重。
2.常用于去除图像噪声
3.模糊图像,以提取粗特征
对图像的边缘:补0 或者不处理边缘
通过平滑处理,我们去除了许多图像中的许多细节,只留下粗特征,这样方便进行阈值分割
加权平滑滤波(高斯滤波)
越靠近中心像素点,其权重越大
运用高斯的正态分布的密度函数来计算模板上的权重
函数调用
dst=cv2.GaussianBlur(src,ksize,0,0)
阈值平滑滤波
顺序统计滤波
顺序统计滤波是一种非线性滤波
f
(
x
,
y
)
≠
f
(
x
)
+
f
(
y
)
f(x,y) ≠ f(x)+f(y)
f(x,y)=f(x)+f(y)
顺序统计滤波操作步骤:
1.对模板集合中的灰度值进行统计排序
2.选择模板集合中的最大值、最小值、或中值
中值滤波
有效去除脉冲噪声(例如椒盐噪声)
更好地保留边缘和轮廓细节
常见的二维中值滤波窗口形状有线状、十字形、方形、菱形及圆形等
- 对于有缓变的较长轮廓线物体的图像,采用方形或者圆形窗口为宜。
- 对于包含有尖顶角物体的图像,适用十字形窗口。
- 窗口的大小则以不超过图像中最小有效物体的尺寸为宜
边界处理方法
当模板滑动到图像边界时,可能会因缺少邻域像素,而使邻域运算无法顺利进行。
解决方法:
1.扩展:在滤波操作开始之前,先增加边缘像素,确保图像的边缘能被处理. 若原图像大小AxB,滤波核大小为CxD,则图像至少要扩展为:(A+C-1)x(B+D-1)
2.还原大小:在滤波处理之后再去掉这些边缘,还原成原图像大小。
- 常量法(BORDER_CONSTANT)
- 复制法(BORDER_REFLICATE):复制最边缘的像素
- 反射法(BORDER_REFLECT):以最边缘的像素为对称轴进行反射
- 外包装法(BORDER_WRAP):截断复制:以图像的左边界与右边界相连,上下边界相连
使用cv2.copyMakeBorder
函数给图像添加边框
3.3.2 图像锐化
相关运算:
卷积运算:
互相关也可以称为不翻转卷积。
• 当滤波核对称
时,卷积和互相关是等价
的。
• 为了实现上(或描述上)的方便起见,很多应用中用互相关来代替卷积。
• 事实上,很多深度学习工具中卷积操作其实都是互相关操作。
图像锐化与图像平滑是相反的操作:
- 图像平滑是去除图像的细节,让图像变得模糊;平滑算子权重和为1
- 图像锐化是突出图像中的细节,让图像变得清晰;锐化算子权重和为0
- 图像平滑是基于空域积分运算
- 图像锐化是基于空域微分运算
锐化算子
- 一阶微分算子:Robert、Prewitt、Sobel
- 二阶微分算子: Laplacian
一阶和二阶微分的区别:
一阶导数可以检测图像中的某个像素点是否在边缘上
二阶导数可以判断一个边缘像素点在亮或暗的一边
图像梯度的定义:对于二维的灰度图像,将x方向和y方向的一阶微分组合起来所构成的矢量称为图像的梯度▽f(x,y)。
一阶微分算子
运用一阶差分近似离散的一阶微分后再对梯度的范数进行近似,左右两项各成为一个算子,一个为垂直算子,一个为水平算子,算子对应位置的值为公式的系数
,因为后续运用算子仍然是做互相关运算
,由算子与图像像素值的互相关运算来近似求梯度微分的结果,从而实现锐化。
罗伯特梯度算子
运用一阶微分的近似计算后再进行近似,左右两项各成为一个算子,一个为垂直算子,一个为水平算子,算子对应位置的值为公式的系数,因为后续运用算子仍然是做互相关运算,由算子与图像像素值的互相关运算来近似求梯度微分的结果,从而实现锐化。
Prewitt算子
为了锐化图像边缘的同时减少噪声的影响,Prewitt算子将模板大小从2x2 扩大到 3x3
Sobel算子
Sobel算子在Prewitt算子的基础上,对中心进行加权,使锐化的同时还有一定的平滑作用。
注意,锐化算子的系数和为0,使得锐化算子在灰度无变化区域的响应为0。
Laplace算子
二阶微分算子同样如此计算,利用二阶差分的近似计算离散二阶微分,然后得到完整的梯度后再求梯度的范数,得到两个算子
–对噪声敏感
–不能检测边缘的方向
–零交叉性质进行边缘定位
Sobel算子
–对噪声敏感度较低
–可以检测边缘的方向
–无法进行边缘定位
3.4 频域滤波
频域滤波的过程
opencv中有关频域滤波函数
cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT)
进行傅里叶变换
- img是输入的图片,需转换成 np.float32 ,
- cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法。
- 输出的结果是双通道的,第一个通道是结果的实数部分,第二个通道 是结果的虚数部分。
cv2.idft(img)
傅里叶反变换
cv2.magnitude(x, y)
:可以获得傅里叶变换的幅值谱
cv2.phase(x, y)
可以获得傅里叶变换的相位谱。
Numpy函数实现傅里叶变换
np.fft.fft2(img)
可以对信号进行傅里叶正变换,输出结果是一个复数数组(单通道);
np.abs(dft)
函数可获得幅值谱;
np.angle(dft)
函数可获得相位谱;
np.fft.ifft2(dft)
函数可实现傅里叶反变换。
示例代码
img = cv2.imread(r'..\img\peppers.bmp',0)
dft = np.fft.fft2(img)
#dft[:,:,0]为傅里叶变换的实部,dft[:,:,1]为傅里叶变换的虚部
magnitude0= np.abs(dft)
magnitude1= 20*np.log(1+magnitude0)#幅值谱
phase_angle0=np.angle(dft)
img_back=np.fft.ifft2(dft)
img_back1 = np.abs(img_back)
低通滤波器
- 只通过低频,阻止高频。
- 低频对应着图像平滑的区域,因此低通滤波相当于
图像平滑
高通滤波器
- 只通过高频,阻止低频。
- 高频对应着图像细节较多的区域,高通滤波相当于
图像锐化
3.5 低通滤波
理想的低通滤波ILPF
• 简单地截去了离原点的距离大于D0(截止频)的所有高频分量。
• 注意傅里叶变换经过了低频移中
• 理想低通滤波器有陡峭的频率特性,其空域响应是一个辛格函数(sinc函数)
• 理想低通滤波会产生振铃
,图像模糊,且具有水波纹。
巴特沃斯低通滤波BLPF
高斯低通滤波GLPF
空域的卷积相当于频域的乘积。
3.6 高通滤波
高通滤波就是让高频分量通过, 并抑制低频分量, 从而增强图像中的高频成分, 使图像的边缘或线条变得清晰, 达到图像的锐化的目的。
第四章 图像复原
图像复原和图像增强的区别与联系
相同:都是为了改善图像视觉效果,便于后续处理。
不同:
1.实现方法不同:
• 图像增强不考虑图像是如何退化的,而是试图采用各种技术来增强图像的视觉效果。因此,图像增强可以不顾增强后的图像是否失真,只要看得舒服就行。
• 而图像复原需知道图像退化的机制和过程等先验知识,据此找出一种相应的逆处理方法,从而得到复原的图像
2.评价标准不同:
• 图像增强突出感兴趣的那部分,不管原图像如何——对比度、信息熵、信噪比
• 利用退化的逆过程恢复原始图像,客观评估:接近原图像——均方差、峰值信噪比、结构相似度
图像复原:将降质的图像恢复成原来的图像
1.数学模型建立:利用退化现象的某种先验知识,建立退化现象的数学模型。
2.复原方法:根据建立的数学模型,进行反向的推演运算,以恢复原来的景物图像
4.1 针对噪声的复原
噪声分类:按噪声信号与图像信号的相关性分类为加性噪声
和乘性噪声
。
加性噪声是一种线性变换,属于线性时不变的研究范围,而乘性噪声属于一种非线性的变换方式,属于非线性系统。因为非线性系统常常很难建模和求解,所以常常用
线性系统来近似非线性系统
。
4.1.1 噪声模型
噪声的描述方法:图像噪声是一个随机量,所以噪声一般用其概率特征来描述
• 高斯噪声(Gaussian)
高斯噪声是一种源于电子电路噪声和由低照明度或高温带来的传感器噪声。高斯噪声也称为正态噪声。
• 瑞利噪声(Rayleigh)
瑞利噪声的形成:深度成像、超声波图像。
• 均匀分布噪声(Uniform)
• 脉冲噪声(Impulse)/椒盐噪声(Salt and pepper noise)
椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。
• 伽马噪声(Erlang或Gamma)
• 指数噪声(Exponential)
4.1.2 空域滤波去噪法----—自适应中值滤波器
-
算术均值(Arithmetic Mean )
-
几何均值(Geometric Mean):实现与算术平均值类似的平滑,但图像细节的损失较小。
-
谐波均值(Harmonic Mean):适合去除盐噪声,但不适合胡椒噪声;也适用于其他类型的噪声,比如高斯噪声。
-
逆谐波均值(Contraharmonic Mean Filter,CF)
-
- Q是滤波器的阶数。
- Q为负值时,可消除盐噪声。
- Q为正值时,可消除胡椒噪声。
- Q = 0为算术均值滤波
- Q = -1为谐波均值滤波
- 不能同时消除两者。
-
顺序统计滤波(Order Statistics Filters)
- 中值滤波
- 最大值
- 最小值
- 中点滤波
- alpha剪枝均值滤波
-
自适应中值滤波(Adaptive Filters):移可变、滤波核会自适应改变
滤波核的大小决定了它能滤除的噪声的多少。
Ø 滤波核越大,能滤除的噪声越多,但产生模糊越严重
Ø 滤波核越小,则模糊较轻,但能滤波的噪声越少
Ø 自适应中值滤波器的大小根据区域的平滑度
而变化。
• 自适应中值滤波的目的:
- 去除脉冲噪声
- 平滑其他类噪声
- 减少失真(过度细化或增厚物体边界)
• 自适应中值滤波器可以处理空间密度更大的脉冲噪声,也可以对非脉冲噪声进行平滑处理。
4.1.3 频域滤波去噪法
• 傅里叶域的频域技术在去除周期噪声方面最为有效。
• 带阻滤波器
• 陷波滤波器
拓展:
基于滤波器的方法:如(自适应)中值滤波、(自适应)维纳滤波:根据图像局部均方差来调整滤波器的输出,局部均方差越大,滤波器越平滑
基于模型的方法:利用模型分布作为先验,复杂的优化问题。如非局部自相似(NSS)模型、稀疏模型、梯度模型、马尔可夫随机场模型。
基于学习的方法:传统机器学习、深度神经网络等方法。依靠经验涉及,缺乏可解释性.
4.2 针对模糊等退化的复原
造成模糊的因素:透镜象差/色差、聚焦不准(失焦,限制了图象锐度) 、 模糊(限制频谱宽度)、噪声(是一个统计过程)、 抖动(机械、电子)等
4.2.1 图像退化模型表示
设f(x,y)是一幅原图像,图像的退化过程可以理解为一个作用于原图像f(x,y)的系统H,或理解为施加于原图像f(x,y)上的一个运算H;同时数字图像也常会因受一些随机误差,也即噪声n(x,y)而退化。由此可得退化模型:
如果退化函数已知,则图像复原将变得较为简单
4.2.2 估计退化函数
估计退化函数的基本方法有:
– 观察法:这种方法需要反复试验,常用于恢复老照片
– 实验法
– 建模法:大气湍流模型、平面运动模糊模型
大气湍流模型退化函数:
平面运动模糊模型退化函数:
x0(t)=at/T,y0(t)=bt/T
在实际应用中,通常采用空域平滑滤波来仿真运动模糊:
模糊尺度由滤波核的大小来决定;
模糊方向由非0项的排列方向来决定。
4.2.3 无约束图像复原——逆滤波
逆滤波(Inverse filter):不考虑噪声,已知退化函数,最小二乘方
逆滤波的目标是找到一个估计图像f,使得接近以下目标函数,即均方误差最小:
求最小值的过程中,不施加任何约束
,称这种复原为无约束复原或非约束复原
4.2.4 有约束图像复原——维纳滤波
维纳滤波(Wiener filter):考虑噪声,最小均值
维纳滤波的总体思路是寻找图像 f(x,y)的一种估计使得f(x,y) 和估计之间的均方误差最小:
(标准)维纳滤波器公式:
当没有噪声时,维纳滤波器就可简化成逆滤波器;
当有噪声时,维纳滤波器也可用信噪功率比作为修正函数对逆滤波器进行修正,可在均方误差最小的意义上提供最佳恢复。实际应用中常令信噪功率比为一个常数k。
4.3 针对畸变的图像复原
常见的图像退化除了图像模糊、噪声以外,还有图像的几何失真,例如:
4.3.1 几何变换
图像几何变换是将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置.
步骤:1.坐标变换、2.灰度插值
几何变换与灰度变换的区别?
◼ 灰度变换:改变灰度值,不改变坐标
◼ 几何变换:改变空间坐标,不改变灰度值
4.3.2 基本的坐标变换
- 平移
g ( x ′ , y ′ ) = f ( x , y ) g( x^{'}, y^{'}) = f(x,y) g(x′,y′)=f(x,y)坐标变换前后存在如下关系
{ x ′ = x + Δ x y ′ = y + Δ y \begin{cases} x^{'} = x + Δx \\ y^{'} = y + Δy \end{cases} {x′=x+Δxy′=y+Δy
以矩阵形式表示平移前后的像素可以得到平移算子
[ x ′ y ′ 1 ] = [ 1 0 Δ x 0 1 Δ y 0 0 1 ] [ x y 1 ] \begin{bmatrix} x^{'} \\ y^{'} \\ 1 \end{bmatrix}=\begin{bmatrix} 1&0&Δx \\ 0&1&Δy \\ 0&0&1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x′y′1 = 100010ΔxΔy1 xy1
超出原图像部分统一设置为0或255
OpenCV 提供了两个变换函数:
◼ cv2.warpAffine: 2 × 3 的变换矩阵
◼ cv2.warpPerspective:3 × 3 的变换矩阵。
def move(img,dx=50,dy=50):
rows,cols= img.shape[:2]
M0 = np.float32([[1,0,dx],[0,1,dy]])
dst0 = cv2.warpAffine(img,M0,(cols,rows))
return dst0
def move(img,dx=50,dy=50):
rows,cols= img.shape[:2]
M0 = np.float32([[1,0,dx],[0,1,dy],[0,0,1]])
dst0 = cv2.warpPerspective(img,M0,(cols,rows))
return dst0
-
镜像
垂直镜像存在如下关系
{ x 1 = x 0 y 1 = h − y 0 \begin{cases} x_1 = x_0 \\ y_1 = h - y_0 \end{cases} {x1=x0y1=h−y0
[ x 1 y 1 1 ] = [ 1 0 0 0 − 1 h 0 0 1 ] [ x 0 y 0 1 ] \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}=\begin{bmatrix} 1&0&0 \\ 0&-1&h \\ 0&0&1 \end{bmatrix}\begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 = 1000−100h1 x0y01
水平镜像(相对y轴)
{ x 1 = w − x 0 y 1 = y 0 \begin{cases} x_1 = w-x_0 \\ y_1 = y_0 \end{cases} {x1=w−x0y1=y0
[ x 1 y 1 1 ] = [ − 1 0 w 0 1 0 0 0 1 ] [ x 0 y 0 1 ] \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}=\begin{bmatrix} -1&0&w \\ 0&1&0 \\ 0&0&1 \end{bmatrix}\begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 = −100010w01 x0y01 -
旋转
设原始图像的任意点A(x,y) 经旋转角度β 以后到新的位置A’(x’,y’) ,为表示方便,采用极坐标形式表示,原始的角度为 α:
{ x ′ = r c o s ( α − β ) = r c o s α c o s β + r s i n α s i n β + y s i n β y ′ = r s i n ( α − β ) = r s i n α c o s β − r c o s α s i n β = y c o s β − x s i n β \begin{cases} x^{'} = rcos(α-β)=rcosαcosβ+rsinαsinβ+ysinβ\\ y^{'} = rsin(α-β)=rsinαcosβ-rcosαsinβ=ycosβ-xsinβ \end{cases} {x′=rcos(α−β)=rcosαcosβ+rsinαsinβ+ysinβy′=rsin(α−β)=rsinαcosβ−rcosαsinβ=ycosβ−xsinβ
[ x ′ y ′ 1 ] = [ c o s β s i n β 0 − s i n β c o s β 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} x^{'} \\ y^{'} \\ 1 \end{bmatrix}=\begin{bmatrix} cosβ&sinβ&0 \\ -sinβ&cosβ&0\\ 0&0&1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x′y′1 = cosβ−sinβ0sinβcosβ0001 xy1
##OpenCV方法:
def rotate(img,angle=45):
rows,cols=img.shape[:2]
M1=cv2.getRotationMatrix2D((cols/2,rows/2),angle ,1)
dst1=cv2.warpAffine(img,M1,(cols,rows))
return dst1
##numpy方法:
# 指定逆时针旋转的角度
im_rotate = img.rotate(angle)
- 缩放
{ x 1 = a x 0 y 1 = a y 0 \begin{cases} x_1 = ax_0 \\ y_1 = ay_0 \end{cases} {x1=ax0y1=ay0
[ x 1 y 1 1 ] = [ a 0 0 0 a 0 0 0 1 ] [ x 0 y 0 1 ] \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}=\begin{bmatrix} a&0&0 \\ 0&a&0 \\ 0&0&1 \end{bmatrix}\begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 = a000a0001 x0y01
多出来的一些空格一般采用最邻近插值
和线性插值法
。
➢ 上采样和下采样:CV领域,将原始图片放大就是上采样,缩小图片就是下采样,池化操作可以理解为一种下采样。
➢ 过采样和欠采样:主要针对数据集不平衡的操作。
增加小样本的数据,为过采样;减少大样本的数据,为欠采样。
4.3.3 灰度插值算法
-
最邻近插值
➢ 最近邻法是将(u0,v0)点最近的整数坐标 (u,v) 点的灰度值取为(u0,v0)点的灰度值。
➢ 在(u0,v0)点各相邻像素间灰度变化较小时,这种方法是一种简单快捷的方法,但当(u0,v0)点相邻像素间灰度差很大时,这种灰度估值方法会产生较大的误差。
-
双线性插值
利用两个平行方向线灰度的线性变化求出另一方向上的灰度线性变化,最后根据比例求出该点的灰度值
步骤:
先计算 f ( u 0 , v ) = f ( u , v ) + a [ f ( u + 1 , v ) − f ( u , v ) ] f(u_0,v)=f(u,v)+a[f(u+1,v)-f(u,v)] f(u0,v)=f(u,v)+a[f(u+1,v)−f(u,v)],a就是u0和u的差值与1的比值
再计算 f ( u 0 , v + 1 ) = f ( u , v + 1 ) + a [ f ( u + 1 , v + 1 ) − f ( u , v + 1 ) f(u_0,v+1)=f(u,v+1)+a[f(u+1,v+1)-f(u,v+1) f(u0,v+1)=f(u,v+1)+a[f(u+1,v+1)−f(u,v+1)
最后计算 f ( u 0 , v 0 ) = f ( u 0 , v ) + β [ f ( u 0 , v + 1 ) − f ( u 0 , v ) ] f(u_0,v_0)=f(u_0,v)+β[f(u_0,v+1)-f(u_0,v)] f(u0,v0)=f(u0,v)+β[f(u0,v+1)−f(u0,v)],同理β也是v的差值比值
• 双线性内插法计算量较大,但没有灰度不连续的缺点(即灰度连续),结果基本令人满意
• 它具有低通滤波性质,使高频分量受损
,图像轮廓可能会有一点模糊
角对齐:corner_align = True
边对齐:corner_align = False
两种不同的对齐方式,目标图像到原图的缩放比例是不一样的。
- 双三次内插法
哪些应用场合只能用最近邻插值法?
标注图像的插值:在进行数据增强时,如对原图像进行缩放等操作,标注图像也应随着进行同尺度的缩放,只能采用最邻近插值法,才能满足标注规则。
4.3.4 几何变换类型
- 刚体变换(Rigid Transform):如果一幅图像中的两点间的距离经变换到另一幅图像中后仍然保持不变。 如平移、旋转和镜像。
- 仿射变换(Affine Transform):如果一幅图像中的直线经过映射后到另一幅图像上仍为直线,并且保持平行关系。平移、旋转、镜像和缩放
- 透视变换(透视变换)(Projective Transform) :如果一幅图像中的直线经过映射后到另一幅图像上仍为直线,但不保持平行关系。
- 非线性变换(Curved Transform):如果一幅图像中的直线经过映射后到另一幅图像上不一定是直线,可能是曲线
仿射变换前后,两坐标系统之间的关系可以表示成以下线性解析式:
{
x
′
=
a
0
+
a
1
x
+
a
2
y
y
′
=
b
0
+
b
1
x
+
b
2
y
\begin{cases} x^{'} = a_0+a_1x + a_2y \\ y^{'} = b_0+b_1x + b_2y \end{cases}
{x′=a0+a1x+a2yy′=b0+b1x+b2y
##仿射变换编程实现
##需要给定基准图像上的三个像素点坐标,以及对应的仿射变换后的图像上的3个点坐标
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2) #生成仿射变换矩阵
dst = cv2.warpAffine(img,M,(cols,rows))#实现仿射变换
#投影变换编程实现
#需要知道变换前后的4对坐标值
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])#变
换前的四个坐标点
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])#变换后
对应的四个坐标点
M = cv2.getPerspectiveTransform(pts1, pts2)#生成变换矩阵
dst = cv2.warpPerspective(img, M, (300, 300))#实现透视变换
4.3.5 几何校正
线性:
非线性:更精确一些的几何校正可以用二次型来近似
有12个未知量,需要6对已知对应点
4.3.6 数据扩充
深度学习中为什么要进行数据扩充?
假设我们的总体数据分布如下,是二次函数模型
若训练数据只个俩个A,B,由这个训练数据得到的模型是一个线性模型,拿这个模型去泛化真实的总体分布数据,泛化能力非常差,出现过拟合
现象
如何进行数据扩充?
深度学习中常见的数据扩充的方法
基于单张图片
-
几何变换
- 翻转
- 旋转
- 裁剪
- 缩放
- 平移
- 仿射变换
-
颜色空间变换
- 对比度变化
- 亮度变化
- 饱和度变化
- 通道分离
- 灰度图
- 直方图增强
- 颜色空间转换
- 颜色扰动
-
像素点操作
- 模糊
- 锐化
- 加噪声
- dropout
- pooling
- random ereasing
基于多张图片
- samplePairing
- mixup
第五章 形态学处理
5.1 形态学基础
- 形态学是研究动物和植物形态和结构的学科。
- 数学形态学作为工具从图像中提取对于表达和描述区域形状有用的图像分量,如边界、骨架及凸壳。
- 其原理是基于数学集合论
形态学运算的本质:结构元素与图像做集合运算
基本集合运算
• 并集
• 交集
• 补集
• 差集
形态学图像处理常用领域:
- 图像预处理
- 增强物体结构
- 从背景中分割物体
- 物体量化描述
空域滤波是滤波核
与图像做相关运算
而形态学运算是结构元素
与图像做集合运算
结构元素(structuring elements ,SE)是小的子图像集合
• 必须指定SE原点。
• SE是四周用0填充的矩形。
• 二值图像的集合运算只需要考虑像素位置。
• 而灰度图像的集合运算还需要考虑灰度值
5.2 基本的形态学运算
-
腐蚀
腐蚀可以理解为:用结构元素B扫描整幅图像X;若B平移p后仍属于X,则平移后的B的代表点属于腐蚀结果图像。
作用:腐蚀能将连接的对象分开、去除喷溅突出、会缩小图像
-
膨胀
B对A膨胀产生的二值图像D是由这样的点(x,y)组成的集合: B的原点位移到(x,y),它与A的交集非空。
作用:膨胀可修复图像断裂、修复侵入突出、会放大图像
-
开运算
先腐蚀后膨胀
作用:开运算一般使对象的轮廓变得光滑,断开狭窄的间断和消除细小的突出物,可以去掉目标外的孤立点
• 开运算的几何解释:类似于B在一个轮廓内部滚动
• 开运算会去除外尖角
-
闭运算
先膨胀后腐蚀
作用:可以填充物体内细小空洞、连接邻近物体、在不明显改变物体面积的情况下平滑其边界的作用。
• 闭运算会去除内尖角
同一个结构元素对图像做多次开运算(闭运算),效果等同于一个开运算(闭运算)。
• cv2.threshold #图像二值化
• cv2.getStructuringElement #生成结构元素
• cv2.dilate #膨胀运算
• cv2.erode #腐蚀运算
• cv2.morphologyEx #开运算、闭运算
5.3 形态学算法
-
边界提取Boundary extraction
• β(A)代表集合A的边界,可以采用以下方式获取:
β(A) = A - (AΘB)
-
区域填充Region filling
区域填充步骤:
- 在区域内确定一个种子点X0
- 从种子点开始膨胀 ,通过与Ac的交集,限制膨胀在闭环边界内
- 不断的迭代,直到𝑋𝑘 = 𝑋𝑘−1
- 最后𝑋𝑘𝑼 𝑨
- 提取连通分量Connected components
什么是连通分量?
• 任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。
• 求图的连通分量的目的,是为了确定从图中的一个顶点是否能到达图中的另一个顶点,也就是说,图中任意两个顶点之间是否有路径可达。
提取连通分量步骤:
- 在连通区域内确定一个种子点X0
- 从种子点开展膨胀 ,通过与A的交集,限制膨胀在连通区域内
- 断的迭代,直到Xk
➢ 提取连通分量的过程也是对连通分量的标注,通常给图像中的每个连通区分配编号,在输出图像中该连通区内的所有的像素值赋值为对应的区域编号,这样的输出图像被称为标注图像。
➢ 在opencv中,函数cv::connectedComponents()
以及cv::connectedComponentsWithStats()
都创建了这样的标记图。
➢ 根据标记图,可以使不同区域有不同的颜色。
5.4 形态学应用
5.4.1 形态学滤波
• 目标:在尽可能不产生畸变的情况下,去除噪声
• 方法:开运算后接一个闭运算
• 腐蚀运算将小于结构元素的噪声去除了,指纹内部出现许多黑点噪声
• 膨胀运算填充指纹内部的许多空洞
• 开运算后仍然有许多新的裂缝
• 膨胀运算填充了指纹中的裂缝
• 最后的腐蚀恢复指纹原来的粗细
• 去除了噪声,但一些裂缝没有完全修复
5.4.2 识别物体形状–击中击不中变换
击中击不中变换
两个结构元素,记为E和F,分别探测图像内部和外部,从而确定物体形状。
- 在击中过程中,只有当结构元素完全匹配图像中的某个区域时,该区域的中心像素值才会被置为1,否则为0。
- 而在不击中过程中,只有当结构元素与图像中的某个区域完全不匹配时,该区域的中心像素值才会被置为1,否则为0。
- 通过这两个过程的组合,可以得到一个新的二值图像,其中目标区域被标记为1,非目标区域被标记为0。
第六章 图像分割
图像经过增强、复原和变换等预处理操作之后,就可以进行图像分割,将我们感兴趣的部分从背景提取出来。
传统的图像分割方法分为三类
- 基于阈值的方法
- 基于边缘的方法
- 基于区域的方法
非传统的基于学习的分割方法也有很多,主要针对比较复杂的图像。
图像分类、目标检测、语义分割、实例分割。
主要详细介绍传统的图像分割方法。
6.1 阈值分割
选取一个合适的阈值最为关键
6.1.1 全局阈值
有两个具体的思路:1.通过观察直方图,选择直方图峰谷的位置作为阈值;2.以最佳阈值将图像灰度直方图分割成两个部分,使两类之间的方差取最大值,即分离性最大。
直方图法
原理:选择直方图峰谷的位置作为阈值
步骤:
1.确定初始阈值,T=127
2.初始阈值,将图像像素分为两组,记为G1和G2
3.计算区域G1和G2的平均灰度 μ1和μ2
4.计算新的阈值 T=(μ1+μ2)/2
5.重复步骤2-4,直到逐次迭代所得的T之差小于事先设定的参数。
最大类间方差法(大津阈值法Ostu)
基本原理:以最佳阈值将图像的灰度直方图分割成两部分,使两类之间的方差取最大值,即分离性最大。此算法利用了最小二乘法原理。
步骤:
灰度级为1-m,灰度级i拥有的像素个数为ni
-
采用初始阈值T将图像像素分为两组,记为C0和C1
-
计算C0和C1的概率的概率
-
计算两组的灰度均值以及计算平均灰度级
- 按照公式计算类间方差
- 使用穷举法计算从0~L-1,找到方差最大时的T即为阈值。
6.1.2 局部阈值
局部阈值法是吧原始的整幅图像分为若干小的子图像,再对每个子图像应用全局阈值法分别求出最优分割阈值
6.1.3 自适应阈值法
- 自适应阈值法,它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值
- 通常是利用图像的局部特性来确定局部阈值。例如可以计算区域的均值、中值、高斯加权平均值(高斯滤波)等,以此来确定阈值
滑动平均变阈值法
➢一般沿行、列或Z字形进行滑动平均
➢ zk+1是扫描序列中第k+1个像素点的灰度值。此像素点的滑动
平均值为:
➢将像素值与滑动平均值进行比较,根据比较情况进行分割。
➢ 常用于文档图像处理
#自适应阈值分割函数
dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type,BlockSize,C)
'''
Maxval:超过阈值的部分的取值,如255;
thresh_type:阈值的计算方法,包含2种类型:
①ADAPTIVE_THRESH_MEAN_:是以局部均值作为阈值
② ADAPTIVE_THRESH_GAUSSIAN_C:是以局部的高斯加权均值作为阈值
Block Size:邻域块大小选择
C:偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值
'''
6.2 区域分割
阈值分割只考虑了像素的灰度值,而没有考虑像素的空间关系,区域分割弥补了这个缺点。
6.2.1 区域生长
思想:将具有相似性质的像素集合起来构成区域
步骤:
◼ 选择合适的种子点;
◼ 确定相似性准则;
✓ 基于区域灰度差
✓ 基于区域内灰度分布统计性质
✓ 基于区域形状
◼ 确定生长停止条件
6.2.2 分裂合并
步骤:
◼ 对于任一区域Ri ,如果V(Ri)>T ,则将其分裂成互不重叠的四等分;
◼ 对相邻区域Ri 和Rj,如果V(Ri∪Rj)≤T ,则将二者合并;
◼ 如果进一步的分裂合并都不可能了,则终止算法
一致性测度
✓ 灰度差
✓ 方差
6.2.3 分水岭算法
基本思想:
- 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷
- 向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,需要在水汇合的地方构建起堤坝。
- 不停的灌水,不停的构建堤坝直到所有的山峰都被水淹没。构建好的堤坝就是对图像的分割。
基于标记的Watershed变换大体可分为三个步骤:
◼ 对原图进行梯度变换,得到梯度图。
◼ 用合适的标记函数把图像中相关的目标及背景标记出来,得到标记图。
◼ 将标记图中的相应标记作为种子点,对梯度图像进行Watershed变换,产生分水线。
由于噪声点或其它因素的干扰,图像中有非常多的局部极小值点,每个点都会自成一个小区域。可能过度分割。解决方法:
➢ 对图像进行高斯平滑操作,抹除很多小的最小值,这些小分区就会合并。
➢ 设置测地距离,如果小于设定阈值,则将这些像素淹没,否则在这些像素上设置大坝
➢ 不从最小值开始增长,可以将相对较高的灰度值像素作为起始点(需要用户手动标记),从标记处开始进行淹没,则很多小区域都会被合并为一个区域,这被称为基于图像标记(mark)的分水岭算法。
在执行分水岭函数watershed之前,必须对第二个参数markers进行处理,它应该包含不同区域的轮廓,每个轮廓有一个自己唯一的编号
算法会根据markers传入的轮廓作为种子(也就是所谓的注水点),对图像上其他的像素点根据分水岭算法规则进行判断,并对每个像素点的区域归属进行划定,直到处理完图像上所有像素点。而区域与区域之间的分界处的值被置为“-1”,以做区分。
6.3 边界分割
6.3.1 边缘检测(Canny算子)
边缘检测算子
➢ 梯度算子(Gradient operators)
➢ Sobel算子(Sobel operator)
➢ 拉普拉斯算子(Laplacian operator)
➢ LoG算子(LoG operator):高斯滤波+拉普拉斯算子
➢ Canny算子(Canny edge detector)
多级边缘检测方法Canny算法的基本思想
1.降低噪声:高斯低通
滤波,平滑图像
2.计算梯度:采用4个方向检测算子提取梯度
3.非极大值抑制:沿着梯度方向寻找局部最大值
4.边缘跟踪:采用双阈值
检测和跟踪边缘
比较邻域梯度,若不是最大值,则置0
设置一大一小2个阔值,大于高阔值,则为强边缘,只大于小阅值,则为弱边缘。
若强边缘的8邻域存在弱边缘,则将其连入边缘
6.3.2 线的连接
边缘检测后,往往边缘会有断裂,对图像分割或连通域分析不利,所以需要进行边界连接
- 局部的边界连接(Local): 利用连接点邻域的信息进行连接
- 区域的边界连接(Regional):利用区域边界上的点信息
- 全局的边界连接(Global): Hough transform,涉及整个图像
局部的边界连接(Local)
算法步骤:
1、计算图像f(x,y)的梯度的模和方向矩阵M(x,y) 和 A(x,y)
2、Sxy代表像素点(x,y)的邻域.
3、如果在邻域Sxy中的一个像素点(s,t)满足以下条件,则(s,t)与(x,y)相连接
4、当Sxy模板中心移动时,记录保存下连接点
评价:计算复杂度高,因为要判断邻域中所有点是否与中心像素点相连接
区域的边界连接(Regional)
◼ 用多边形拟合的方法逼近区域边界:
要求:
✓ 要求获得区域边界上的若干点
✓ 这些点必须按顺序排列(例如顺时针)。
✓ 指定两个起点(例如最左和最右的点)
算法步骤:
- 连接起点和终点A、B,得到直线AB
- 计算其他点到直线AB的垂直距离
- 寻找到最大距离,将最大距离点C作为新的项点
- 连接AC和BC,然后继续迭代,直到计算的所有垂直距离小于阈值 T
6.3.3 线的检测(Hough变换)
Hough变换是一种检测、定位直线和曲线的有效方法。
基本原理:Hough变换是把二值图像空间变换到Hough参数空间,在参数空间用极值点的检测来完成目标的检测 。
- 图像空间中的一个点(xi,yi)对应参数空间中的一条直线 yi = axi +b。一条直线上的点在参数空间中所对应的直线,都会通过同一个点
- Hough变换采用投票的方式来检测直线的长度
Hough变换原理
(a,b)参数空间的问题:当是垂直线时,斜率a是无穷值。
改进方法:用极坐标代替直角坐标。极坐标中,任何一条直线可以表示成:xcosθ+ysinθ=ρ
参数空间中,每一条曲线,代表极坐标空间中的一个点。极坐标中的同一条直线上的点,在参数空间中都相交于一个点
Hough变换检测直线的步骤:
- 先将图像进行二值化
- 初始化二维累加矩阵A(ρ,θ)
- 对于二值图像上的每个非零坐标点(x0,y0) ,让θ依次变化,并计算得到(ρ,θ) 对。
- 累加过点(ρ,θ)的个数,A(ρ,θ) = A(ρ,θ)+1
- 找到A中最大值的点就对应了最长的直线
Hough变换检测曲线的步骤:
- 先将图像进行二值化 (x-a)2+(y-b)2=r2
- 初始化三维累加数组 A(a,b,r)
- 对于二值图像上的每个非零坐标点 (x0,y0),让a,b依次变化,并计算得到(a,b,r)
- 累加过点(a,b,r)的个数A(a,b,r) = A(a,b,r) + 1
- 找到A中较大值的点就对应着圆
6.4 神经网络分割
6.4.1 语义分割
• 语义分割就是将一张图片表达成机器能够读懂的语言,那么也就意味着我们就需要对图像进行操作,将不同类型的事物分割,最终让图像中的每一个像素点都有它所属的类别class。
• 在自动驾驶、医疗影像、三维重建等领域角色重要;
• 相对于分类和检测,语义分割更高级
性能评估指标
- 像素准确率(Pixel Accuracy,PA):这是最简单直接的指标,计算正确分类的像素点占总像素点的比例。然而,它并没有考虑到不同类别像素之间的平衡问题,因此在某些情况下可能不够准确。
- 类别像素准确率(Class Pixel Accuracy):针对每个类别计算像素准确率,这样可以更详细地了解模型在每个类别上的性能。
- 平均类精度(Mean Class Accuracy,MCA):各类别像素分类准确率的平均值,用于衡量模型对每个类别的预测性能。这个指标考虑了类别之间的平衡,比像素准确率更为全面。
- 交并比(lntersection over Union,loU):也称Jaccard指数,用于计算预测分割区域与真实标注区域之间的重叠程度。loU值越高,表示预测分割区域与真实标注区域越接近,分割效果越好。
- 平均交并比(Mean Intersection over Union,MloU):是语义分割任务中最重要的评价指标之一。它计算每个类别的IoU,然后取平均值。MoU能够综合考虑所有类别,并且对于不平衡的数据集也能给出较好的评价
语义分割经典网络
- 卷积神经网络(CNN)是最常用的深度学习模型之一,在图像语义分割中发挥着重要的作用。它通过多层的卷积和池化操作,提取图像的局部特征,并利用全连接层将特征映射到目标类别上。典型的CNN模型包括FCN、U-Net、SegNet、Deeplab、 EfficientNet等。这些模型利用端到端的训练方式,能够直接将像素归类到对应的语义类别中。
- 循环神经网络(RNN):RNN是一种适用于序列数据的深度学习模型,其在自然语言处理领域有广泛应用。在图像语义分割中,RNN通过将像素间的时间依赖性考虑在内,能够有效处理图像中的序列信息。常见的RNN模型包括长短时记忆网络(LSTM)、门控循环单元(GRU)等。这些模型将图像按照像素顺序展开成一维序列,并利用RNN进行特征提取和分类。
➢FCN网络是一种用于语义分割的深度学习模型。与传统的卷积神经网络相比,FCN将全连接层替换为卷积层,使得网络能够输出与输入图像大小相同的分割结果。
➢ FCN网络结构主要分为两个部分:全卷积部分和反卷积部分。全卷积部分通常采用一些经典的CNN网络(如VGG、ResNet等)来提取图像特征。反卷积部分则通过上采样操作(如双线性插值或转置卷积)将特征图恢复到原图像大小,从而得到每个像素的类别预测。
➢ FCN还采用了跳级结构(skip connections),将不同层次的特征图进行融合,以便结合浅层细节信息和深层语义信息,提高分割结果的精度
6.4.2 实例分割
• 实例分割不仅需要将图像分为不同的语义类别,还要在每个类别内部进一步区分不同的实例。
• 实例分割算法能够将每个人和车辆的像素分割出来,并为它们分配唯一的标识符,以便进一步分析和理解图像。
实例分割主要网络
- Mask R-CNN:这是一种基于区域卷积神经网络(RCNN)的实例分割方法,由Kaiming He等人于2017年提出。Mask R-CNN在Faster R-CNN的基础上进行了改进,不仅解决了目标检测问题,还实现了实例分割。它首先通过RPN(Region Proposal Network)生成候选框,然后对候选框进行分类和边界框回归,最后添加了一个用于预测对象掩模的分支,实现了对每个实例的像素级分割。
- Hybrid Task Cascade (HTC):这是实例分割中的一种级联框架。它结合了多个阶段的预测结果,通过逐步优化来提高实例分割的精度。
- Cascade Mask R-CNN:这种模型是在Mask R-CNN的基础上,通过向级联添加mask head来扩展Cascade R-CNN,从而实现了实例分割。
- BlendMask:该算法通过结合底部特征金字塔和顶部单个高层特征,创建了一个混合特征表示。这种表示方式有助于捕捉更多细节信息,从而提高实例分割的精度。BlendMask在多个数据集上表现出色,特别是在处理复杂场景和物体遮挡时展现出优越的性能。
- SOLOv2:作为SOLO系列的升级版,SOLOv2在保持高速度的同时,进一步提升了实例分割的精度。它采用了一种新的特征表示方法,能够更有效地捕捉物体的边界和形状信息。此外,SOLOv2还引入了一些优化策略,如多尺度训练和测试,以进一步提高性能。
- YOLACT++:YOLACT++是对YOLACT的改进版,它在保持实时性能的同时,显著提高了实例分割的精度。该算法采用了一种新的质子-掩码表示方法,能够更有效地生成高质量的分割掩码。此外,YOLACT++还引入了一些新的训练策略和技术,如数据增强和损失函数优化,以进一步提高性能。
6.4.3 全景分割
全景分割是一种综合了语义分割和实例分割的图像分割任务。它旨在将图像中的每个像素分配给语义类别,并为每个实例分配唯一的标识符,同时保持语义分割的连续性。全景分割不仅要解决物体实例的分割,还要处理不可数类别(uncountable classes),例如天空、道路和草地等。这些不可数类别被视为背景。
全景分割的经典算法
- Mask R-CNN:这一算法扩展了Faster R-CNN,使其能够进行实例分割。Mask R-CNN在目标检测的基础上,增加了一个并行的掩码预测分支,用于为每个实例生成像素级的分割掩码。这使得Mask R-CNN能够同时完成目标检测和实例分割任务,进而实现全景分割。
- Panoptic FPN:该算法是一种基于特征金字塔网络(FPN)的全景分割方法。它采用box-based策略,将thing和stuff使用不同的分支进行预测。其中,thing的分割基于目标检测boxes,而stuff则直接进行语义分割。最后,通过融合这两个分支的结果,得到全景分割的结果。
- EfficientPS:这是一种在计算效率上表现优异的全景分割算法。其设计目标是在保持高性能的同时,降低计算开销。EfficientPS采用了一种新的网络架构,通过共享计算和减少冗余信息,实现了高效的全景分割。
第七章 图像描述与特征提取
所提取的特征可以放大不同类别之间的区别。
提取的特征应具有平移不变性、旋转不变性、尺度不变性
等特性,是图像的本质特征。
常用的特征包括:灰度(颜色)特征、几何形状特征、区域特征、纹理特征、空间关系特征。
图像描述就是提取图像特征,然后用数学的方法来描述图像的特征
7.1 灰度描述
幅度特征
- 均值
- 最大值
- 最小值
- 方差
- 对比度
- 信噪比
变换系数特征
频域中的一些特征,例如傅里叶变换的功率谱和幅度谱具有位移不变性,
即当f(x,y)的原点位移时,幅值谱和功率谱保持不变。因为空域移位,频域调制(乘以复指数信号),幅度不变,仅是相位发生改变
1.功率谱
2.幅值谱
直方图特征
在信息论中,熵用来衡量一个随机事件的不确定性。熵越大,代表该随机变量取特定值的时候具有的信息量越大
7.2 边界描述
为了描述目标物的形状,通常采用目标物的边界
来表示物体
➢ 链码描述:实质上是一串指向符的序列
,可以描述任意曲线或闭合的
边界,有4向链码、8向链码等
8链码:任一像素点有8个邻近像素,指向符共有8个方向。链码表示就是从某一起点开始沿曲线观察每一段的走向,并用相应的指向符来表示,结果形成一个数列
➢ 傅里叶描述子
高频分量对应细节,低频分量对应总体形状。因此用一些低频分量的傅里叶系数足以近似描述边界形状
7.3 区域描述
7.3.1 几何特征
1.区域面积
二值图像,统计非零值的个数
2.位置
形心:目标形状的中心,计算方式是所有像素坐标求平均
质心:目标质量的中心,计算方式是先计算图像总像素值,然后计算每个像素相对于对象形心的加权平均。
二值目标区域的形心与质心等同
3.区域周长:
(1) 区域和背景交界线(接缝)的长度
(2) 区域边界8链码的长度
(3) 边界点数之和
4.方向
二阶矩轴:物体上的全部点到该线的距离平方和最小
5.距离
1)欧几里德距离
2)4-领域距离
3)8-邻域距离
6.圆形度
描述连通域与圆形相似程度的量。根据圆周长与圆面积的计算公式,定义圆形度的计算公式如下:
7.矩形度
描述连通域与矩形相似程度的量
8.长宽比
7.3.2 不变矩
不变矩图像的某些矩对于平移、旋转、尺度等几何变换具有一些不变的性质,称为不变矩
。
对于数字图像f(x,y) ,(j+k) 阶矩定义为:
利用归一化的中心矩,可以获得对平移、缩放、镜像和旋转都不敏感的7个不变矩,定义如下:
较高阶的矩对于成像过程中的误差、微小的变形等因素比较敏感,一般不能有效地识别物体
7.4 纹理描述
纹理的定义:纹理倾向于表现重复性,同样的局部块重复地出现
最简单的纹理分析方法之一是基于图像灰度直方图的矩分析法
7.4.1 矩分析法
纹理反映了灰度分布的重复性,人们自然考虑点对
之间的灰度关系
基于灰度直方图的矩分析法常用的参数:
-
均值(Mean):反映纹理的光密度值
-
方差(Variance):反映纹理的幅度
-
扭曲度(Skewness):表示偏离平均灰度的像素百分比
-
峰度(Kurtosis):反映直方图是倾向于聚集在增值附近还是散布在尾端,-3是保证峰度的高斯分布为0
-
熵(Entropy)
缺点:基于直方图的矩分析法不能完全反映两幅图像的纹理差异,难以完整表达纹理的空间域特征信息
7.4.2 灰度差分统计法
灰度差分统计法通过计算图像中一对像素间
灰度差分直方图来反映图像的纹理特征。可以表达纹理空间域特征
-
令 δ = ( Δ x , Δ y ) δ =(Δx,Δy) δ=(Δx,Δy)为两个像素间的位移矢量,fδ(x,y)是位移量为δ的灰度差分:
f δ ( x , y ) = ∣ f ( x , y ) − f ( x + Δ x , y + Δ y ) ∣ f_δ(x,y) = |f(x,y)-f(x+Δx,y+Δy)| fδ(x,y)=∣f(x,y)−f(x+Δx,y+Δy)∣ -
指定δ = (Δx,Δy)的大小和方向,灰度差分的所有可能取值共有m级(图像的灰度级别),求出灰度差分直方图Pδ
- 粗纹理时,位移相差为δ的两像素通常有相近的灰度等级,fδ(x,y)值较小,灰度差分直方图集中在fδ(x,y) = 0附近;
- 粗纹理时,位移相差为δ的两像素的灰度有较大变化,fδ(x,y)值一般较大,灰度差分直方图值会趋于发散。
- 令Pδ(i)是fδ(x,y)的灰度差分直方图,基于灰度差分直方图描述纹理的参数
- 灰度差分直方图会随着δ方向矢量的变化而变化
- 一幅图像在某一方向上灰度变化小,则fδ(x,y)较小,差分直方图集中在0处,差分直方图的均值较小,熵较小,能量较大。均值较小,说明差分直方图分布在i=0处,纹理较粗。
- 能量反映灰度差分均匀性,越不均匀,能量越大。熵反映擦划分直方图的一致性,均匀分布的直方图,熵值较大
7.5 常用的特征提取算法
• 在图像识别系统中,通常不直接使用像素特征,而是使用更具有区分性的特征来作为识别系统的输入数据
• 经典的图像特征:
◼ GLCM(Gray Level Co-Occurrence Matrix-GLCM)灰度共生矩阵法
◼ LBP(Local Binary Pattern)局部二值模式
◼ HOG(Histogram of Oriented Gradient)方向梯度直方图
◼ SIFT(Scale Invariant Feature Transform)关键点特征描述子
◼ Haar
7.5.1 灰度共生矩阵法(GLCM)
作用:灰度共生矩研究有空间关系的像素对,能较精确地反映纹理粗糙程度和重复方向。通过计算图像中特定方向和特定距离的两像素出现的次数
,反映图像的方向、间隔、变化幅度及快慢等综合信息。
𝑃(𝑖,𝑗|𝜃, 𝑑) = {(𝑥, 𝑦)|𝑓(𝑥, 𝑦) = 𝑖, 且𝑓(𝑥 + Δ𝑥, 𝑦 + Δ𝑦) = 𝑗}
灰度共生矩阵的第 i 行第 j 列元素表示图像上两个相距为 d,方向为θ 、分布具有灰度值 i 和 j 的像素对出现的次数
若图像的灰度级为L,则i,j的取值范围为[0,L-1],共生矩阵的大小为L*L
GLCM三大要素:
➢ 角度 𝜃 一般取0°, 45°, 90°, 135°
➢ 距离(大于等于1个像素单位)
➢ 灰度级别(最大GLCM=256 x 256)
根据相邻像素点之间距离参数d不同,可以得到不同距离的GLCM
对正常的灰度图像来说,最小灰度值为0,最大的灰度值为255,共计256个灰度级别,所以GLCM的大小为256x256,但是可以对灰度级别进行降维操作,比如可以每8个灰度值表示一个level这样,这样原来256x256大小的共生矩阵就可以改成256/8 * 256 /8 = 32x32的共生矩阵。
例题
灰度共生矩阵反映了图像灰度分布关于方向、邻域和灰度变化幅度的综合信息,但它并不能直接提供区别纹理的特征,常用以下参数定量描述纹理特征:
对比度:反映图像的清晰度和纹理的沟纹深浅。纹理越清晰,反差越大对比度也就越大。
相关度:用来度量部灰度相关性,值越大,相关性也越大
逆分差:清晰、规律性较强、易于描述的,值较大
能量:若灰度共生矩阵的元素值相近,则能量较小,表示纹理细致;能量值大表明一种较均一和规则变化的纹理模式
熵:反映随机性,表明了图像灰度分布的复杂程度,熵值越大,图像越复杂
from skimage.feature import greycomatrix,greycoprops
#计算灰度共生矩阵
m = greycomatrix(image,distances,angles,levels = 256,symmetric = False,normed = False)
#计算GLCM的纹理特征,P[,prop]是灰度等级从i到j在一个距离d和一个角度θ中出现的次数
prop = greycoprops(P[,prop])
7.5.2 局部二值模式(LBP)
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和光照不变性等优点。
原始的LBP算子定义在一个3×3的窗口内,以窗口中心像素为阈值,与相邻的8个像素的灰度值比较,若周围的像素值大于中心像素值,则该位置被标记为1,否则标记为0。如此可以得到一个8位二进制数(通常还要转换为10进制,即LBP码,共256种),将这个值作为窗口中心像素点的LBP值,以此来反应这个3×3区域的纹理信息
原始的LBP算子仅仅只是覆盖了很小的一个3×3领域的范围,这显然不能满足提取不同尺寸纹理特征的需求。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域。改进后的LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。
基本LBP算子缺点:随着采样点数P的增加,二进制模式的种类是呈指数趋势增长的。过于
复杂且庞大的信息量对于纹理的表达是不利的,需要对LBP得到的二进制模式种类进行降维
➢ 在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变
均匀模式LBP:限制一个二进制序列从0到1或从1到0的跳变次数不超过2次。跳变次数超过2次时,视为同一类模式。
- 等价模式:如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)
- 混合模式类:两次跳变以上例如10010111(共四次跳变)。
- 通过这样的改进,模式数量由原来的2P种减少为 P ( P-1)+2种
➢ 原始LBP算子是灰度不变的,但不是旋转不变的。图像旋转的话就会得到不同的LBP值
➢ 解决办法:不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的LBP 值。
对图像做旋转操作==对二进制编码循环移位
原始LBP得到的数值转化为二进制编码,对它进行循环移位操作,有8种情况(包括自身)。
均匀模式+旋转不变模式LBP改进:
• 先计算跳变次数
• 跳变次数小于等于2,则各自代表一类,跳变次数大于2的所有情况归为一类
• 再对其二进制编码做循环移位,求出最小值。
7.5.3 方向梯度直方图(HOG)
作用:在一幅图像中,梯度或边缘的方向密度分布能够很好地描述局部目标区域的特征,HOG正是利用这种思想,对梯度信息做出统计,并生成最后的特征描述。常用于物体检测,特别是行人检测。
步骤:
- 预处理:Patch可以是任意尺寸,但需要有一个固定比例:比如长宽比为1:2,以下图像尺寸为720475,我们需要选100200大小的patch来计算HOG特征,再调整为64*128
- 计算梯度图像
首先计算水平和垂直方向的梯度,再计算梯度的直方图
可以使用以下kernel计算,也可以使用opencv里面kernel大小为1的Sobel算子来计算
- 在88的网格中计算梯度直方图
图像分割成88大小的网格,每一个网格计算一个梯度直方图
先转换成一个紧凑/压缩的表示:
一个88得到图像有883 = 192个像素值,每个像素又分为两个值(幅值magnitude和方向direction,取三个channel中最大的作为幅值),所以转换为88*2 = 128紧凑表示。
直方图是有9个bin的向量,角度:0,20,40,60……160。bin的值是每个角度对应幅值之和。
介于幅值之间的角度要把幅值按照比例放到两个bin中(注:角度0也是角度180)
![图片1](https://i-blog.csdnimg.cn/blog_migrate/4899a00e37188473f724a43a8e44b821.png)
![图片2](https://i-blog.csdnimg.cn/blog_migrate/83d36aea2c153987a0dc8e469cc8a200.png)
- 16*16块归一化
问题:图像梯度对于光线很敏感
解决方法:对向量用L2进行归一化
- 计算HOG特征向量
为了计算这整个patch的特征向量,需要把36*1的向量全部合并组成一个向量。向量的大小可以这么计算:
- 我们有多少个1616的块?水平7个,垂直15个,总共有715=105次移动。
- 每个1616的块代表了361的向量。所以把他们放在一起也就是36*105=3780维向量。
可视化HOG
- 通常HOG特征描述子是画出88网格中91归一化的直方图
- 直方图的主要方向捕捉这个人的外形,特别是躯干和腿
7.5.4 关键点特征描述子(SIFT)
作用:SIFT用于提取图像中的关键点和描述符,广泛应用于图像匹配、物体识别、图像拼接等领域
步骤
- 尺度空间极值检测
- 关键点定位
- 确定关键点方向
- 关键点描述子
尺度空间理论:高斯核是唯一可以产生多尺度空间的核。当高斯函数中的 取不同值时,卷积后得到不同清晰度的高斯图像,好比人眼从不同距离观测照片。
SIFT的特征点筛选目的:寻找在不同尺度空间下的极值点,保证这些特征点在放大或者缩小的条件下均存在,以获得特征的缩放不变性
7.5.5 Haar
作用:Harr特征的计算原理是通过计算图像中不同位置和大小的矩形框内像素值的差异来提取图像的特征。这种计算方法相对简单直接,不涉及复杂的数学运算或模型训练,因此能够较快地得出结果。
➢ 在人脸识别领域,Harr特征能够提取人脸的局部特征;也经常用于目标检测任务,如行人检测等,Harr特征能够有效地描述目标的形状和纹理信息,帮助算法更准确地定位和识别目标。
➢ 如脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。
➢ 但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。
Haar特征也被称为矩形特征。Haar特征(模板)分为三类:边缘特征、线性特征和对角线特征、中心特征。特征模板内有白色和黑色两种矩形,
➢ 模板的特征值为白色矩形像素和减去黑色矩形像素和:v=Sum白-Sum黑
➢ 描述的是图像在局部范围内像素值明暗变换信息;
➢ 遍历每个窗口提取Haar特征提取会使得计算量爆炸,因此,一般Haar特征会配合积分图技术
一起来使用。
计算haar特征的步骤:
- 选定矩形框:在图像上选择一个矩形区域,这个矩形可以是任意大小和位置。矩形框的选择通常取决于你想要检测或识别的图像特征。
- 分割矩形框:将选定的矩形框分割成两个或四个相等的小矩形。分割方式取决于你想要的特征类型。例如,如果你想检测边缘特征,可能会将矩形框分割成左右或上下两部分。
- 计算像素值和:分别计算每个小矩形区域内所有像素值的和。这可以通过遍历每个小矩形内的像素,并将其值相加来实现。
- 计算像素值差异:计算不同小矩形之间像素值的差异。例如,如果你将矩形框分割成左右两部分,可以计算左部分像素值的和与右部分像素值的和的差。这个差异值就代表了该区域的Harr特征。
- 移动矩形框:在图像上移动矩形框,并对每个新的位置都重复上述步骤,计算Harr特征值。通过改变矩形框的大小、位置和分割方式,可以提取出图像中不同位置和尺度的特征。
为了加速Harr特征的计算,通常会使用积分图(Integral Image)的概念。积分图预先计算了图像中每个位置左上角所有像素的和,这样在计算任意矩形区域的像素和时,只需进行简单的索引和加减运算,而无需重新遍历图像。这大大提高了Harr特征的计算效率。
当需要提取Haar特征时,我们需要计算矩形块中像素值之和时,我们只需要将其四个顶点对应于积分图中的值拿出来,做一个求和操作即可。例如:
S1的面积等与I1-I2-I4+I3,一个矩形区域内像素累加求和计算转变成了几个值的加减运算,大大的提升了算法执行效率。
小结
➢GLCM:基于像素对关系,统计特定方向和距离两个灰度级出现的次数
➢ LBP: 基于像素对关系,对邻域与中心像素点的灰度值大小关系进行编码
➢ HOG: 把局部的方向梯度直方图作为特征描述子
➢ SIFT:不同尺度极值点检测,确定关键点,基于方向梯度直方图的关键点描述
➢ Harr:基于模板,比较特定方向两个区域像素和之差