常用的去水印方法:
克隆修复工具:使用图像处理软件(如Photoshop)中的克隆修复工具可以选择一个样本区域,然后将其复制到水印区域,以覆盖水印。这种方法在简单的水印上可能效果不错,但复杂的水印可能需要更多的手动调整。
模糊或马赛克处理:可以使用模糊或马赛克工具对水印进行处理,以使其模糊不清或完全不可识别。但这可能会导致图像细节损失,对图像质量有一定影响。
反相处理:对图像进行反相处理可能会削弱水印的效果,但这对于所有类型的水印并不总是有效。
频域处理:利用图像的频域特性,例如使用傅里叶变换等技术来检测并去除水印。这需要一定的图像处理知识和工具。
混合模式调整:通过调整图像的混合模式(如减淡、变暗等),有时可以减轻水印的可见程度。
图像修复算法:一些先进的图像修复算法可以帮助填补或去除水印,这些算法通常基于深度学习和人工智能技术
opencv 去除水印更多层面是原理性的展示操作,实际应用中更多的是通过机器学习或者利用工具来应用
编写程序,模拟数字水印的嵌入和提取过程。
import cv2
import numpy as np
def zh_ch(string):
return string.encode('gbk').decode(errors='ignore')
#读取原始载体图像
lena=cv2.imread("lena.png",0)
#读取水印图像
watermark=cv2.imread("watermark.bmp",0)
#将水印图像内的值 255 处理为 1,以方便嵌入
#后续章节会介绍使用 threshold 处理
w=watermark[:,:]>0
watermark[w]=1
#读取原始载体图像的 shape 值
r,c=lena.shape
#============嵌入过程============
#生成元素值都是 254 的数组
t254=np.ones((r,c),dtype=np.uint8)*254
#获取 lena 图像的高七位
lenaH7=cv2.bitwise_and(lena,t254)
#将 watermark 嵌入 lenaH7 内
e=cv2.bitwise_or(lenaH7,watermark)
#============提取过程============
#生成元素值都是 1 的数组
t1=np.ones((r,c),dtype=np.uint8)
#从载体图像内提取水印图像
wm=cv2.bitwise_and(e,t1)
print(wm)
#将水印图像内的值 1 处理为 255,以方便显示
#后续章节会介绍使用 threshold 实现
w=wm[:,:]>0
wm[w]=255
#============显示============
cv2.imshow(zh_ch('原图'),lena,)
cv2.imshow(zh_ch("水印"),watermark*255) #当前 watermark 内最大值为 1
cv2.imshow(zh_ch("加水印图"),e)
cv2.imshow(zh_ch("提取水印图像"),wm)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
图(a)是原始图像 lena。
图(b)是水印图像 watermark。在程序中,该图像首先会被处理为二值图像,在显示时将
其元素值乘以 255,以方便显示。
图©是在图像 lena 内嵌入水印图像 watermark 后得到的含水印载体图像 e。
图(d)是从含水印载体图像 e 内提取到的水印图像 wm。
通过肉眼无法观察出含水印载体图像和原始图像的不同,水印的隐
蔽性较高。但是,由于该方法过于简单,其安全性并不高,在实际处理中会通过更复杂的方式实现水印的嵌入。
这是简单的水印处理,从水印原理来看这是一个不可逆转的操作,如果想要开发这种系统,要么就针对性的某一个水印去除,要么 针对不可预知的水印 就要深度学习来操作了。这块后面实验讲解