通过读取文件之后,生成的图像数据一般是二维或三维数组,每个数组元素是8位字节大小。有时候从网络里接收到一串数据,它是字节顺序的,比如有30000个字节,想要把它转换为300X100的图像大小,这个怎么样操作呢?又或者想转换三维数组的彩色图像呢?又或者想从二维或三维数组转换为单个字节顺序从网络发送出去?
通过下面的代码来构造一个bytearray数组,bytearray是可变的bytes数据类型,可以通过bytearray创建和定义。用下面代码来构造3万个随机字节:
randBytes = bytearray(os.urandom(30000))
os.urandom函数随即产生n个字节的字符串,可以作为随机加密key使用,在这里把这些数据当作图像使用。接着需要把bytearray的一维数组转换为np.array的一维数组,如下:
flat = np.array(randBytes)
这时就可以得到np.array数组的形式,就可以对数组进行变换了,比如变换为二维的灰度图像数组,或三维彩色图像数组,当然要数组的元素个数符合H*W或者H*W*3的格式才能转换,如下:
grayImage = flat.reshape(100, 300)
colorImage = flat.reshape(100, 100, 3)
还可以进行逆转换,下面是把灰度图像数组转换为一维的数组:
flatGray = grayImage.flatten()
上面所有内容可以使用下面的例子来演示:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt
import os
#用随机函数生成图像数据
randBytes = bytearray(os.urandom(30000))
#转换为numpy的一维数组
flat = np.array(randBytes)
#转换为二维数组,图像大小为100X300
grayImage = flat.reshape(100, 300)
#写文件
cv2.imwrite('temp1.png',grayImage)
cv2.imshow('grayImage',grayImage)
#转换为随机彩色文件,图像大小为100X100
colorImage = flat.reshape(100, 100, 3)
cv2.imwrite('temp2.png',colorImage)
cv2.imshow('colorImage',colorImage)
#从图像转换为一维顺序数组
flatGray = grayImage.flatten()
print(len(flatGray))
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
灰度图像
彩色图像
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/102487540