python 利用opencv去除图片水印

1,957 阅读1分钟

      测试图片 在这里插入图片描述

      第一种方法:

      该方法看着是不是很简单?没错就这么几行代码:

      import cv2
      ​'''
      更多Python学习资料以及源码教程资料,可以在群821460695 免费获取
      '''
      def get_water():
          # 黑底白字
          src = cv2.imread('yuan.png')  # 默认的彩色图(IMREAD_COLOR)方式读入原始图像
          # black.jpg
          mask = cv2.imread('di.png', cv2.IMREAD_GRAYSCALE)  # 灰度图(IMREAD_GRAYSCALE)方式读入水印蒙版图像
          # 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果较好)
          dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_NS)
      ​
          cv2.imwrite('result1.jpg', dst)
      ​
      get_water()

      但是这种方式需要一个美工,让他配合你做一张di.png: 在这里插入图片描述 那么来看一下该方式效果图 在这里插入图片描述

      第二种方式:

        还是以上一张图片为例,这种方式还是需要美工配合,只是图片变了,di2.png如下: 在这里插入图片描述 同时换了一种算法模式,但是注意该方法效率不高,使用该图片时跑一次代码就行了,但是若是别的图片,你可能需要跑几遍代码之后,才能出现最终效果(若你发现采用该方式去除水印,发现去除后的效果,只是水印颜色变淡了,那么请你在对处理过的图,再次执行该代码,如此多次之后,请用肉眼识别最好的效果)

      import cv2
      import numpy
      def get_water2():
      ​
          src = cv2.imread('yuan.png')
          mask = cv2.imread('di2.png')
          save = numpy.zeros(src.shape, numpy.uint8)  # 创建一张空图像用于保存for row in range(src.shape[0]):
              for col in range(src.shape[1]):
                  for channel in range(src.shape[2]):
                      if mask[row, col, channel] == 0:
                          val = 0
                      else:
                          reverse_val = 255 - src[row, col, channel]
                          val = 255 - reverse_val * 256 / mask[row, col, channel]
                          if val < 0: val = 0
      ​
                      save[row, col, channel] = val
      ​
          cv2.imwrite('result2.jpg', save)
      ​
      get_water2()

      不多说直接,上效果图 在这里插入图片描述