文章目录
1.原理
- 对于照片中小的噪音和划痕,使用坏点周围的像素取代坏点,这样它看起来和周围像素就比较像了。
- 为了实现这个目的,科学家们已经提出了好几种算法,OpenCV 提供了其中的两种。这两种算法都可以通过使用函数cv2.inpaint() 来实施。
- cv2.INPAINT_TELEA:算法从这个区域的边界开始向区域内部慢慢前进,首先填充区域边界像素。它要选取待修补像素周围的一个小的邻域,使用这个邻域内的归一化加权和更新待修复的像素值。权重的选择是非常重要的。对于靠近带修复点的像素点,靠近正常边界像素点和在轮廓上的像素点给予更高的权重。当一个像素被修复之后,使用快速行进算法(FMM)移动到下一个最近的像素。FMM 保证了靠近已知(没有退化的)像素点的坏点先被修复,这与手工启发式操作比较类似。
- cv2.INPAINT_NS:它首先沿着正常区域的边界向退化区域的前进(因为边界是连续的,所以退化区域非边界与正常区域的边界应该也是连续的)。它通过匹配待修复区域中的梯度向量来延伸等光强线(isophotes,由灰度值相等的点练成的线)。为了实现这个目的,作者是用了流体动力学中的一些方法。完成这一步之后,通过填充颜色来使这个区域内的灰度值变化最小。
2.opencv中的图像修补
代码速记:
- cv2.inpaint()
实战:
def inpaint_img(self):
mask = cv2.imread('../images/mask2.png', 0)
#用mask修补图像
dst = cv2.inpaint(self.img, mask, 3, cv2.INPAINT_TELEA)#第3个参数是inpaint radius
dst2 = cv2.inpaint(self.img, mask, 3, cv2.INPAINT_NS)
#画图
titles = ['raw', 'mask','telea','ns']
imgs = [self.img,mask,dst,dst2]
for i in range(4):
plt.subplot(2, 2, i + 1)
if i==1:
plt.imshow(imgs[i], 'gray')
else:
plt.imshow(cv2.cvtColor(imgs[i],cv2.COLOR_BGR2RGB))
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()