1. 程式人生 > >python中影象IO與OpenCV的轉換

python中影象IO與OpenCV的轉換

最近在使用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