【python与数据分析】实验八——图像批量添加数字水印及实现模拟转盘抽奖游戏

发布于:2022-10-23 ⋅ 阅读:(286) ⋅ 点赞:(0)

一、实验目的

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)

2.结果