通過讀取檔案之後,生成的圖像資料一般是二維或三維數組,每個數組元素是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()
結果輸出如下:
灰階圖像
彩色圖像