一、实验目的
1.理解空域添加数字水印的原理;
2.熟悉安装扩展库pillow;
3.熟悉扩展库pillow操作图像方法;
4.熟悉运用字典结构。
5.初用numpy实现模拟转盘抽奖游戏
二、实验内容
1.将本周课堂或视频讲的代码选部分在IDLE 或 Jupyter Notebook中敲一遍。
2.首先准备一个图像文件(参考代码是民大校徽muc.png)作为水印,再准备一些图像文件(.jpg,.bmp,.png等类型均可,具体是什么类型,在代码体现出来就可!),参考代码是将文件都拷到当前工作目录上(我的工作目录是C:\python37\),如果文件不在当前工作目录,代码中打开文件和保存文件的语句要体现文件路径。
>>> import os
>>> os.getcwd() #查看当前工作目录
'E:\\python 3.7\\程序保存'
3.用到numpy\pandas的方法先自学相应部分(后面会讲)。
三、实验要求
水印在目标图像文件中的位置随机选择为左上角、右下角或图像中间,并且水印图像的背景在目标图像设置中设置成透明。添加水印后的图存为xxx_new.kkk。注意:水印图的像素大小要小于被加水印的图,否则,加不了!
四、实验步骤
1.需敲入的代码见ppt课件或视频;
2.先按实验目的做完,再敲入参考代码运行,在理解代码原理基础上,改编程序。
3.编程实现模拟转盘抽奖游戏,统计不同奖项的获奖概率。
五、图像批量添加水印
1.代码
from random import randint
from os import listdir
from PIL import Image
#打开并读取其中的水印像素,即不是白色背景的像素
#读到内存中,放到字典中以供快速访问
im=Image.open('muc.jpg')
width,height=im.size
pixels=dict()
for w in range(width):
for h in range(height):
c=im.getpixel((w,h))[:3]
if c!=(255,255,255):
pixels[(w,h)]=c
def addWaterMark(srcDir):
#获取目标文件夹中所有图像文件列表
picFiles=[srcDir+'\\'+fn for fn in listdir(srcDir) if fn.endswith(('.bmp','.jpg','.png'))]
#遍历所有文件,为每个图像添加水印
for fn in picFiles:
iml=Image.open(fn)
w,h=iml.size
#如果图片尺寸小于水印图片,不加水印
if w<width or h<height:
continue
#其原始图像左上角、中间或右小角添加数字水印
#具体位置根据position进行随机选择
p={0:(0,0),#左上角
1:((w-width)//2,(h-height)//2),#中间位置
2:(w-width,h-height)}#右下角
#随机生成一个位置
position=randint(0,2)
left,top=p[position]
#修改像素值,添加水印
for p,c in pixels.items():
try:
#目标图像是彩色的
iml.putpixel((p[0]+left,p[1]+top),c)
except:
#目标图像是灰色的
iml.putpixel((p[0]+left,p[1]+top),sum(c)//len(c))
#保存加入水印之后的新图像文件
iml.save(fn[:4]+'_new'+fn[-4:])
#为当前文件夹中的图像文件添加水印
addWaterMark('.')
2.结果
六、模拟转盘抽奖游戏
1.代码
import numpy as np
import pandas as pd
#模拟转盘100000次
data=np.random.ranf(100000)
#奖项等级划分
category=(0.0,0.08,0.3,1.0)
labels=('一等奖','二等奖','三等奖')
#对模拟数据进行划分
result=pd.cut(data,category,labels=labels)
#统计每个奖项的获奖次数
result=pd.value_counts(result)
#查看结果
print(result)