wiki、opencv、《计算机视觉–算法与应用》、《数字图像处理_冈萨雷斯》
借用书中一句话以表对图像预处理的看法:有些人可能认为计算视觉研究范围不应该包括图像处理,但是多数计算机视觉应用为了获得满意的结果,需要考虑图像的预处理!
对于颜色空间、卷积(注意,需要反转180度)、图像增强和图像复原的区别、相机3A技术等不在这里赘述了
一、空间滤波
参见opencv中的Smoothing Images
1) 均值滤波
低通滤波方式,会滤掉噪声、边缘等,如不想模糊边缘,应该使用不模糊边缘的滤波方式,opencv中提供了均值滤波(cv::blur
)和方框滤波(cv::boxFilter
),方框滤波可以设置是否归一化
均值滤波有普通均值滤波、加权均值滤波,不管怎样,卷积核元素和加起来是1
2)高斯滤波(cv::GaussianBlur
)
比其它的均衡模糊滤波器更高地保留了边缘效果,卷积元素是由一个二维高斯分布生成,再归一化得到
3)中值滤波(cv::medianBlur
)
应对椒盐噪声
4)双边滤波(cv::bilateralFilter
)
最好地保护边缘的滤波方法,需要调整三个参数,详见opencv
5)图像去噪(cv::fastNlMeansDenoising
)
参考:https://blog.csdn.net/qq_30815237/article/details/86737690
上面说的几种滤波方法都是使用一个像素周围一个小的邻域计算均值或者中值取代中该像素,而NlMeans(Non-Local Means,非局部均值)使用自然图像中普遍存在的冗余信息来去噪声,它利用了整幅图像来进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声,这种算法要消耗更多的时间,但是结果很好
二、对比度增强
2.1 点算子
1)线性点算子
线性点算子可以用来增强对比度,需要调整调整增益参数和偏差参数,通用性不强
2)非线性点算子
包括分段线性变换、指数变换、对数变换、伽马校正等,实现时一般使用查表法(cv::LUT
)
2.2 直方图均衡化
直方图均衡化是基于直方图统计实现的,将原来的
p
r
(
r
)
p_r(r)
pr(r) 调整成
p
s
(
s
)
=
1
L
−
1
p_s(s)=\frac{1}{L-1}
ps(s)=L−11,这是一个均匀分布,即达到均衡化的目的,如下:
直方图均衡化用来增加图像的对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。
缺点:
- 灰度级数目可能会减少
- 它对处理的数据不加选择,它可能会增加背景噪声的对比度(使暗区域的噪声变得可见),也会降低有用信号的对比度
两种直方图均衡化方法:
- 全局直方图均衡化(HE,histogram equalization)
- 局部自适应直方图均衡化(CLAHE,contrast limited adaptive histogram equalization)
如果图像中有的地方亮有的地方暗,这时候再使用一个直方图对图像进行均衡化,效果将很差,一个最直观的直接方法就是分块进行均衡化,同时也要想办法消除区块效应,即,如果一个区块中像素值差不多,那么很容易造成噪声过放(AHE has a tendency to overamplify noise in relatively homogeneous regions of an image),因此需要对对比度进行限制,对于给定的一个像素
(
i
,
j
)
(i,j)
(i,j),根据块的水平和垂直位置
(
s
,
t
)
(s,t)
(s,t) 计算其权重,以限制其对比度
三、伽马校正
伽马校正起源于,早期黑白电视用于显示TV信号的荧光材料对输入电压的响应是非线性的,即电压与其产生的亮度关系称为gamma(
γ
\gamma
γ)
B
=
V
γ
B=V^{\gamma}
B=Vγ
其中
γ
≈
2.2
\gamma \approx2.2
γ≈2.2,即指数为2.2的幂函数。然后为了补偿这个效应,摄像机电路需要将感知到的亮度
Y
Y
Y 使用
1
γ
\frac{1}{\gamma}
γ1 进行逆伽马变换,这样做的好处,可以减少模拟信号传输期间增加的噪声,如下图所示:
另外,虽然现在用的相机都是数字相机了(传输使用的数字信号),不传输噪声了,但是压缩需要量化啊,所以在传感器端(相机)使用逆gamma校正还是有用的。
DSO光度标定
参考:路游侠
我们常说的gamma校正(其实这里应该叫作逆gamma校正吧?)是用于去除输入辐射量与量化的像素之间的非线性映射,而这个
γ
\gamma
γ 系数是未知的(每个相机都不同)。采集图像的传感器为图像进行伽马编码的目的是用来对人类视觉的特性进行补偿(因为图像拍出来是给人看的,那么如果选择图像输出时不进行硬件gamma校正,那么是不是就可以不用进行gamma补偿?),从而根据人类对光线或者黑白的感知,最大化地利用表示黑白的数据位或带宽。人眼对暗部比较敏感,因此一般选择提高暗部的分辨率。这些因素会非线性地修正曝光量,所以DSO作者就使用光度标定进行拟合这个gamma校正(还有光晕vignetting
),以恢复真实的入射光能量irradiance
四、边缘检测
参考:https://blog.csdn.net/tigerda/article/details/61192943
边缘检测包括:
- 一阶微分算子:Roberts 、Sobel 、Prewitt,
- 二阶微分算子:Laplacian、Log/Marr
- 非微分边缘检测算子:Canny
这几种方法区别如下:
边缘检测的卷积核(矩阵)的元素和是0(图像锐化是1),卷积后的图像会很暗,只有边缘的地方是有亮度的。注意,在边缘检测之前,使用低通滤波,比如,均值滤波、高斯滤波,以移除细节
也有使用深度学习做的边缘检测算法,比如,holistically-nested edge detection (HED),效果比canny要好
@leatherwang
<完>