Python实现图像空域随机水印加入与提取

本文要点在于Python扩展库pillow中Image类的运用。图像空域随机水印的主要思路在于:在原始图像中随机选取一些位置替换为水印图片中的非背景像素,同时生成日志文件记录替换的位置和水印中像素位置的对应关系,然后可以根据加入水印的图片和日志文件来提取和验证水印。

from os import remove

from os.path import isfile

from random import sample, choice

from PIL import Image

def mergeWaterMark(originPic, watermarkPic, logTxt):

#原始图片和水印文件必须为图片格式

if (not originPic.endswith(('.jpg', '.bmp', '.png'))) or (not watermarkPic.endswith(('.jpg', '.bmp', '.png'))):

return 'Error format.'

#打开原图和水印图片,并获取大小

imOrigin = Image.open(originPic)

originWidth, originHeight = imOrigin.size

imWaterMark = Image.open(watermarkPic)

watermarkWidth, watermarkHeight = imWaterMark.size

#随机生成水印位置

allPositions = [(w,h) for w in range(originWidth) for h in range(originHeight)]

positions = sample(allPositions, watermarkWidth*watermarkHeight)

fpLog = open(logTxt, 'w')

#写入水印文件大小

fpLog.write(str((watermarkWidth,watermarkHeight))+'\n')

for w in range(watermarkWidth):

for h in range(watermarkHeight):

c = imWaterMark.getpixel((w,h))

c = c[:3]

#只写入不是白色的像素

if c != (255,255,255):

p = choice(positions)

#写入像素值

imOrigin.putpixel(p, c)

#避免重复修改同一个像素

positions.remove(p)

#生成日志文件,用来提取水印

fpLog.write(str(p+(w,h))+'\n')

fpLog.close()

#生成加入水印的新图片

imOrigin.save(originPic[:-4]+'_new'+originPic[-4:])

def restoreWaterMark(mergedPic, logTxt, watermarkPic):

#删除原来提取过的水印文件

if isfile(watermarkPic):

remove(watermarkPic)

imMerged = Image.open(mergedPic)

with open(logTxt) as fp:

for line in fp:

#读取每一行并还原为元组

line = eval(line.strip())

#第一行是水印图片尺寸,先创建水印文件

if len(line)==2:

imWaterMark = Image.new('RGB', line, (255,255,255))

else:

#提取水印像素并写入水印文件

c = imMerged.getpixel((line[0],line[1]))

c = c[:3]

imWaterMark.putpixel((line[2],line[3]), c)

#保存提取的水印

imWaterMark.save(watermarkPic)

#测试

mergeWaterMark('origin.bmp', 'watermark.png', 'logg.txt')

restoreWaterMark('origin_new.bmp', 'logg.txt', 'restoredWaterMark.png')

测试用的原始图片:

测试用的水印图片:

加入水印以后的图片:

提取出来的水印:

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2016-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

BootStrap网格布局

  如何使用BootStrap样式   BootStrap与其他的开源库类似,直接引用它的css样式文件就可以使用了。 <link rel="styleshee...

237100
来自专栏腾讯NEXT学位

药药切克闹!用酷炫的vue~制作酷炫的menu~

42150
来自专栏jojo的技术小屋

原 荐 CSS3 transform 引起z

18440
来自专栏腾讯IVWEB团队的专栏

SVG 动画精髓(下)

线条动画 SVG 中的线条动画常常用作过渡屏(splash screen)中。例如:一些比较炫酷的 LOGO 和 炫酷的效果,大家有没有动心想学一学,看看自己到...

60600
来自专栏林德熙的博客

wpf VisualBrush 已知问题

本文告诉大家,visualBrush 已知 bug ,希望大家使用 VisualBrush 时可以知道

21810
来自专栏jojo的技术小屋

原 荐 CSS3 transform 引起z

作者:汪娇娇 时间:2017年9月5日 单纯的z-index,可以通过设置数值的大小来决定层级的高低,但一涉及transform,z-index就失效了,为什么...

33280
来自专栏前端黑板报

纯CSS实现宽高相等(或者其他比例)

动态实现宽高相等以及其它比例,一般使用的是JS。这次介绍一种使用纯CSS实现的方法。 基础结构与样式: 1 2<div class="box"> </div> ...

40470
来自专栏用户2442861的专栏

关于CSS中background样式的repeat和no-repeat的坐标问题

http://blog.sina.com.cn/s/blog_98eef7830101cv8t.html

8510
来自专栏木头编程 - moTzxx

HTML 图片映射<map>标签整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

26840
来自专栏大数据挖掘DT机器学习

信息图制作教程案例

当大家看到很多好看的信息图的时候最喜欢问的两个问题是:用什么软件做的?怎么做的? 在工具选择上,使用Adobe Illustrator,制作过程大家...

41670

扫码关注云+社区

领取腾讯云代金券