opencv计算摄影学之图像修补

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()

在这里插入图片描述

发布了154 篇原创文章 · 获赞 45 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36622009/article/details/104798395