二进制读写+运用随机数生成图像——python实现

目标

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:
在这里插入图片描述
更加离散了,具体表象出来的是像素点有一种“非黑即白“的感觉。

但其实像素点的分布从总体上看还有点像,这一点与随机种子的设置(生成伪随机数)有关。我这次文中没有对随机种子并没有进行深入讨论,希望以后可以补充。

大家加油!

发布了31 篇原创文章 · 获赞 6 · 访问量 2816

猜你喜欢

转载自blog.csdn.net/weixin_29732003/article/details/102535479