设为首页 收藏本站
查看: 1463|回复: 0

[经验分享] python opencv加水印 去水印

[复制链接]

尚未签到

发表于 2018-8-7 12:16:02 | 显示全部楼层 |阅读模式
# coding=utf-8  import cv2
  import numpy as np
  # 膨胀算法 Kernel
  _DILATE_KERNEL = np.array([[0, 0, 1, 0, 0],
  [0, 0, 1, 0, 0],
  [1, 1, 1, 1, 1],
  [0, 0, 1, 0, 0],
  [0, 0, 1, 0, 0]], dtype=np.uint8)
  class WatermarkRemover(object):
  """"
  去除图片中的水印(Remove Watermark)
  """
  def __init__(self, verbose=True):
  self.verbose = verbose
  self.watermark_template_gray_img = None
  self.watermark_template_mask_img = None
  self.watermark_template_h = 0
  self.watermark_template_w = 0
  self.watermark_start_x = 0
  self.watermark_start_y = 0
  def load_watermark_template(self, watermark_template_filename):
  """
  加载水印模板,以便后面批量处理去除水印
  :param watermark_template_filename:
  :return:
  """
  self.generate_template_gray_and_mask(watermark_template_filename)
  def dilate(self, img):
  """
  对图片进行膨胀计算
  :param img:
  :return:
  """
  dilated = cv2.dilate(img, _DILATE_KERNEL)
  return dilated
  def generate_template_gray_and_mask(self, watermark_template_filename):
  """
  处理水印模板,生成对应的检索位图和掩码位图
  检索位图
  即处理后的灰度图,去除了非文字部分
  :param watermark_template_filename: 水印模板图片文件名称
  :return: x1, y1, x2, y2
  """
  # 水印模板原图
  img = cv2.imread(watermark_template_filename)
  # 灰度图、掩码图
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  _, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_TOZERO + cv2.THRESH_OTSU)
  _, mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)
  mask = self.dilate(mask)  # 使得掩码膨胀一圈,以免留下边缘没有被修复
  #mask = self.dilate(mask)  # 使得掩码膨胀一圈,以免留下边缘没有被修复
  # 水印模板原图去除非文字部分
  img = cv2.bitwise_and(img, img, mask=mask)
  # 后面修图时需要用到三个通道
  mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
  self.watermark_template_gray_img = gray
  self.watermark_template_mask_img = mask
  self.watermark_template_h = img.shape[0]
  self.watermark_template_w = img.shape[1]
  # cv2.imwrite('watermark-template-gray.jpg', gray)
  # cv2.imwrite('watermark-template-mask.jpg', mask)
  return gray, mask
  def find_watermark(self, filename):
  """
  从原图中寻找水印位置
  :param filename:
  :return: x1, y1, x2, y2
  """
  # Load the images in gray scale
  gray_img = cv2.imread(filename, 0)
  return self.find_watermark_from_gray(gray_img, self.watermark_template_gray_img)
  def find_watermark_from_gray(self, gray_img, watermark_template_gray_img):
  """
  从原图的灰度图中寻找水印位置
  :param gray_img: 原图的灰度图
  :param watermark_template_gray_img: 水印模板的灰度图
  :return: x1, y1, x2, y2
  """
  # Load the images in gray scale
  method = cv2.TM_CCOEFF
  # Apply template Matching
  res = cv2.matchTemplate(gray_img, watermark_template_gray_img, method)
  min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
  if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
  x, y = min_loc
  else:
  x, y = max_loc
  return x, y, x + self.watermark_template_w, y + self.watermark_template_h
  def remove_watermark_raw(self, img, watermark_template_gray_img, watermark_template_mask_img):
  """
  去除图片中的水印
  :param img: 待去除水印图片位图
  :param watermark_template_gray_img: 水印模板的灰度图片位图,用于确定水印位置
  :param watermark_template_mask_img: 水印模板的掩码图片位图,用于修复原始图片
  :return: 去除水印后的图片位图
  """
  # 寻找水印位置
  img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  x1, y1, x2, y2 = self.find_watermark_from_gray(img_gray, watermark_template_gray_img)
  self.watermark_start_x = x1
  self.watermark_start_y = y1
  # 制作原图的水印位置遮板
  mask = np.zeros(img.shape, np.uint8)
  # watermark_template_mask_img = cv2.cvtColor(watermark_template_gray_img, cv2.COLOR_GRAY2BGR)
  # mask[y1:y1 + self.watermark_template_h, x1:x1 + self.watermark_template_w] = watermark_template_mask_img
  mask[y1:y2, x1:x2] = watermark_template_mask_img
  mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
  # 用遮板进行图片修复,使用 TELEA 算法
  dst = cv2.inpaint(img, mask, 4, cv2.INPAINT_TELEA)
  # cv2.imwrite('dst.jpg', dst)
  return dst
  def remove_watermark(self, filename, output_filename=None):
  """
  去除图片中的水印
  :param filename: 待去除水印图片文件名称
  :param output_filename: 去除水印图片后的输出文件名称
  :return: 去除水印后的图片位图
  """
  # 读取原图
  img = cv2.imread(filename)
  dst = self.remove_watermark_raw(img,
  self.watermark_template_gray_img,
  self.watermark_template_mask_img
  )
  if output_filename is not None:
  cv2.imwrite(output_filename, dst)
  return dst

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548203-1-1.html 上篇帖子: python入门:基础语法 下篇帖子: python 使用pexpect实现自动交互示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表