目标
1.实现二进制文件的读写
2.运用随机数生成图像
3.体会不同分布生成的随机数的效果
过程
代码如下
先调包:
import numpy as np
from PIL import Image
import struct
import random
这里很郁闷的一点是,我的anaconda每回想安装matplotlib都会失败,我这回就且先不用。
然后我先构造一个500*500的服从[0,255]均匀分布的矩阵,并显示图片
image = np.zeros((500, 500), dtype=np.float)
for i in range(500):
for j in range(500):
image[i,j] = random.randint(0, 255)
print(image)
image0 = Image.fromarray(image)
image0.show()
显示的图片如下:
然后是写入文件:
# 写二进制文件
fp = open('image.raw', 'wb')
write_buf = struct.pack('={}f'.format(image.size), *image.flatten())
fp.write(write_buf)
fp.close()
再然后我把文件读出来,并将数据存入矩阵中
# 读取二进制文件
fp = open('image.raw', 'r+b')
raw_data = fp.read(500 * 500 * 4)
raw_data = struct.unpack('={}f'.format(500 * 500), raw_data)
imager = np.asarray(raw_data).reshape(500, 500)
然后我改写该矩阵,并将改写的矩阵用图像表示出来
#我将该矩阵中的数据改为服从正态分布N(127,sigma)的随机数
#先建立随机数矩阵
for i in range(500):
for j in range(500):
imager[i,j] = np.floor(random.gauss(127, 20))
#显示图像
image1 = Image.fromarray(imager)
image1.show()
图像如下:
我们可以明显感受到,数据变得更加稠密了。
然后,我再将改好的数据写进文件里
代码如下:
#写入文件
fp = open('image.raw', 'wb')
write_buf = struct.pack('={}f'.format(imager.size), *imager.flatten())
fp.write(write_buf)
fp.close()
最后,我将验证该数据是否成功写入
#验证文件已写入
f = open('image.raw', 'rb')
raw_data = f.read(500 * 500 * 4)
raw_data = struct.unpack('={}f'.format(500 * 500), raw_data)
imagerw = np.asarray(raw_data).reshape(500, 500)
image11 = Image.fromarray(imagerw)
f.close()
image11.show()
图像如下:
说明新的数据已经成功写入。
如果我把正态分布的方差改变一下,看看会有什么效果:
sigma = 70:
离散的效果就更加强烈了,视觉效果上跟均匀分布的很像。
sigma = 200:
更加离散了,具体表象出来的是像素点有一种“非黑即白“的感觉。
但其实像素点的分布从总体上看还有点像,这一点与随机种子的设置(生成伪随机数)有关。我这次文中没有对随机种子并没有进行深入讨论,希望以后可以补充。
大家加油!