OpenCV 图像变换之 —— 图像修复

本文最后更新于:2022年5月21日 凌晨

本文摘录 OpenCV 中的图像变换相关操作内容,重点介绍 Opencv 中的图像修复操作。

概述

图像经常因噪声造成破损。镜头上可能有灰尘或水渍,旧图像可能有划痕,或者图像的一部分被损坏。图像修复是消除这种损坏的一种方式,它通过摄取被损坏区域边缘的色彩和纹理,然后传播混合至损坏区域的内部。

图像修复

cv2.inpaint()

OpenCV 图像修复函数

官方文档

  • 函数使用
1
2
3
4
5
6
cv2.inpaint(
src, # 源图像
inpaintMask, # 需要修复的图像区域mask,uint8 格式单通道图像,非零部分表示需要修复
inpaintRadius, # 算法所考虑的每个点的圆形邻域的半径
flags[, # 修复算法 cv2.INPAINT_NS 或 cv2.INPAINT_TELEA
dst] ) -> dst
  • 示例代码
1
2
3
4
5
img = mt.cv_rgb_imread('img1_inpaint.png')
mask = (img[:,:, 0] > 254).astype('uint8')
res_1 = cv2.inpaint(img, mask, 12, cv2.INPAINT_NS)
res_2 = cv2.inpaint(img, mask, 12, cv2.INPAINT_TELEA)
PIS(img, mask, [res_1, 'cv2.INPAINT_NS'], [res_2, 'cv2.INPAINT_TELEA'])

图像去噪

另一个重要的问题是图像中的噪声。在许多应用中,噪声的主要来源于低光条件的影响。在低光下,数字成像器的增益必须增加,结果呢,噪声也被放大。这种噪声的特征是随机孤立的像素,看起来太亮或太暗,但在彩色图像中也可能发生变色。

  • OpenCV 中实现的去噪算法称为“快速非局部均值去噪”(FNLMD),基于Antoni Buades, Bartomeu Coll, Jean-Michel Morel 的工作成果。虽然简单的去噪算法基本上依赖于对其周边的各个像素进行平均,但是 FNLMD 的中心概念是在图像中的其他地方寻找类似的像素,再对其取平均值。在这种情况下,像素被认为是相似的像素,不是因为它的颜色或强度相似,而是因为它在环境中是相似的。这里的关键是,许多图像包含重复的结构,因此即使像素被噪声破坏,也会有许多其他类似的像素。

  • 基于以像素$p$和大小$s$为中心的窗口$B(p,s)$,进行类似像素的识别。在点的周围给定一个期望更新的窗口,我们可以将这个窗口与在其他像素$q$周围的窗口进行比较。我们如下定义$B(p,s)$和$B(q,s)$之间的平方距离:

$$
d^{2}(B(p, s), B(q, s))=\frac{1}{3(2 s+1)} \sum_{c=1}^{3} \sum_{j \in B(0, s)}\left(I_{c}(p+j)-I_{c}(q+j)\right)^{2}
$$

  • 其中,$c$是色彩索引,$I_c§$是图像上点$p$在通道$c$的色彩强度,并且的总和超过了patch元素。从这个平方距离,可以将权重分配给相对于当前正在更新的像素的每隔一个像素。这个权重由下式给出:

$$
w(p, q)=e^{-\frac{\max \left(d^{2}-2 \sigma^{2}, 0.0\right)}{h^{2}}}
$$

  • 在这个权重函数中,$σ$是噪声中预期的标准偏差(强度单位),而是一个通用的过滤参数,可以确定补丁的速度随着平均距离从我们更新的补丁增长而变得无关紧要。一般来说,增加$h$的值将增加去除的噪声,但是会牺牲一些图像细节。降低的值会保留细节,同时增加噪音。

cv2.fastNIMeansDenoising() / cv2.fastNlMeansDenoisingColored()

参考资料

  • 《学习 OpenCV3》 第十一章