前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现图像空域随机水印加入与提取

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

作者头像
Python小屋屋主
发布2018-04-16 15:46:04
2.1K0
发布2018-04-16 15:46:04
举报
文章被收录于专栏: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')

测试用的原始图片:

测试用的水印图片:

加入水印以后的图片:

提取出来的水印:

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

本文分享自 Python小屋 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档