簡體   English   中英

如何從OpenCV圖像中獲取TIFF字節流,而不是numpy數組?

[英]How do I get a TIFF bytestream from an OpenCV image, rather than a numpy array?

在python中,我想轉換使用OpenCV處理的圖像以某種圖像格式傳輸(在這種情況下為TIFF ,但可能是:BMP,JPEG,PNG,.....)。

為此,將OpenCV圖像編碼到存儲緩沖器中就足夠了。 問題是,當我使用cv2.imencode()來執行此操作時,返回的對象仍然看起來像一個numpy數組:

import cv2
img_cv2_aka_nparr = cv2.imread('test.jpg')
my_format = '.tiff'
retval, im_buffer = cv2.imencode(my_format, img_cv2_aka_nparr)
print type(im_buffer)

im_buffer只是另一個numpy數組 - 它根本不是TIFF編碼的字節流! 據我所知,python中的OpenCV圖像總是表現得像numpy數組,甚至通過type()看起來像numpy數組。

事實上,如果你想創建一個虛擬的“OpenCV圖像”,你必須使用numpy - 參見例如https://stackoverflow.com/a/22921648/1021819

為什么會這樣,我該如何解決? 也就是說,我如何獲得實際的TIFF編碼字節流而不是另一個numpy數組呢?

現在我喜歡numpy ,但在這種情況下,我需要非python服務可以讀取圖像,因此它需要采用通用(最好是無損)格式(參見上面的列表)。

(我已經繞過JSON中嵌入numpy的房子並決定反對它。)

我可以使用PIL /枕頭, scipy和一些,但我試圖最小化依賴性(即到目前為止只有cv2numpy和內在函數)。

謝謝!

關注https://stackoverflow.com/a/50630390/1021819並在Dan Masek的評論上構建(但不是很多),所需的額外步驟只是使用im_buffer.tobytes() ,它返回一個可以是字節im_buffer.tobytes()的字符串通過流發送。

Python OpenCV圖像似乎表現為純粹的numpy數組。 正如Dan cv2.imencode()所指出的,可以使用cv2.imencode()將數組轉換為TIFF,PNG,BMP,JPG等。

關於格式和壓縮的選擇顯然存在爭議。 在上面的例子中,有一個偏好無損壓縮,暗示TIFF,BMP或PNG(仍然會有爭議)。 Python綁定到OpenCV的有TIFF無壓縮可調參數(不像(?)的C ++綁定?),所以它不是很容易發現正在做什么存在。 使用其他庫顯然可以更好地壓縮級別,但我的目標是最小化依賴性(見上文)。

BMP編碼的圖像不小於TIFF圖像。 PNG壓縮在python OpenCV和設置中是可調的

cv2.imencode('.png', nparr, [int(cv2.IMWRITE_PNG_COMPRESSION),1])

到目前為止,我們已經給出了最佳的速度權衡。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM