天天看點

python 讀取圖檔成為一維數組_在OpenCV裡圖像資料與一維數組轉換

通過讀取檔案之後,生成的圖像資料一般是二維或三維數組,每個數組元素是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()

結果輸出如下:

python 讀取圖檔成為一維數組_在OpenCV裡圖像資料與一維數組轉換

灰階圖像

python 讀取圖檔成為一維數組_在OpenCV裡圖像資料與一維數組轉換

彩色圖像