小言_互联网的博客

在OpenCV里图像数据与一维数组转换

551人阅读  评论(0)

通过读取文件之后,生成的图像数据一般是二维或三维数组,每个数组元素是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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场