前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战 | 文本图片去水印--同时保持文本原始色彩(附源码)

实战 | 文本图片去水印--同时保持文本原始色彩(附源码)

作者头像
Color Space
发布2021-12-01 17:31:15
1.1K0
发布2021-12-01 17:31:15
举报

导读

本文主要介绍文本图片中去除水印并尽可能保留文本原始色彩的实例。

背景介绍

OpenCV中去除水印最常用的方法是inpaint,通过图像修复的方法来去除水印,最终效果也要根据实际图像来看(时好时坏)。有些图像并不适用inpaint方法来去除水印,比如下面的这种包含文本的图像中的水印,即便提供了水印的mask图,修复后也会丢失文字信息,这并不是我们想要的。

以下图为例:

提供水印mask图:

使用inpaint来去除水印的效果:

从上图我们可以明显看出inpaint处理后原有文字信息遭到破坏,这样的效果可以说很糟糕。


另一种方法,如我们上篇文章介绍,使用对比度和亮度变换来实现,具体参考:

涨姿势!OpenCV对比度亮度变换竟能用来去水印(附Python/C++源码)

代码语言:javascript
复制
import cv2
import numpy as np

img = cv2.imread("kk.jpg")

alpha = 3.0
beta = -200

new = alpha * img + beta
new = np.clip(new, 0, 255).astype(np.uint8)

cv2.imwrite("cleaned.png", new)

print('Done!')

实现效果如下图所示:

乍一看,水印很好的去除了,结果还不错!但是,仔细对比发现,部分文字信息颜色与原本的颜色产生了明显差异,如下图所示:

文字与箭头颜色明显变化

处理后文本颜色变化明显

所以这种方法,也有一定的弊端,使用时需注意!

更好的保留文本原始色彩的方法

那么我们如何让它去除水印的时候又能很好的保留文本原始的色彩呢?这里提供一种方法,具体步骤如下:

【1】使用inRange方法,获取水印区域的mask;

【2】与原图对比,mask区域内白色位置置为白色(255,255,255),mask区域内黑色位置保留原始文本像素值。

具体代码如下:

代码语言:javascript
复制
import numpy as np

import cv2

font = cv2.FONT_HERSHEY_SIMPLEX

img = cv2.imread("./kk.jpg")
lower_hsv = np.array([160,160,160])
upper_hsv = np.array([255,255,255])

mask = cv2.inRange(img,lower_hsv,upper_hsv)#根据颜色范围删选
mask = cv2.GaussianBlur(mask,(1,1),0)
for i in range(0,img.shape[0]): #访问所有行
  for j in range(0,img.shape[1]): #访问所有列
      if mask[i,j] == 255:
          img[i,j] = [255,255,255]  
cv2.imwrite('res.jpg', img)
print('Done!')

运行效果:

细节对比:

---------------------------------------------------------

对比发现,去除水印的同时较好的保留了文本原始的色彩,方法仅供大家参考,具体问题还需具体分析!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 更好的保留文本原始色彩的方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档