python中影象IO與OpenCV的轉換
阿新 • • 發佈:2019-02-05
最近在使用python操作影象時,經常需要處理影象IO以及與OpenCV中的影象矩陣相互轉換,就是想省去另存為影象再讀取這一環節。
import matplotlib.pyplot as plt
%matplotlib inline
import cv2
import io
import numpy as np
下面顯示OpenCV讀入的矩陣
img=cv2.imread('bmw.jpg')
plt.imshow(img[:,:,::-1])
輸出:
print(img.shape)
輸出: (274, 286, 3)
下面顯示open讀入的stream流,可以看出是io.BufferedReader類
with open('./bmw.jpg','rb') as f:
print( f)
輸出:
<_io.BufferedReader name=’./bmw.jpg’>
再轉成二進位制流
with open('./bmw.jpg','rb') as f:
print( f.read())
輸出:
b’\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\
使用OpenCV把矩陣轉為二進位制流
img_encode = cv2.imencode('.jpg', img)
#可以看出第二個元素是矩陣
print(img_encode)
輸出:
(True, array([[255],
[216],
[255],
…,
[127],
[255],
[217]], dtype=uint8))
講矩陣轉為二進位制流
str_encode = img_encode[1].tostring()
print(str_encode)
輸出: b’\xff\xd8\xff\xe0\x00\x10JFIF\x00\x0
將二進位制流轉為ByteIO型別
cc = io.BytesIO(str_encode)
print(cc)
輸出:
<_io.BytesIO object at 0x0000022D3C06F8E0>
這是和上面的 open結果一樣,即和_io.BufferedReader一樣
print(cc.read() )
輸出:
# b’\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x0