![](/img/trans.png)
[英]How do I make pycharm autoimport from numpy rather than numpy.ma.core?
[英]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
和一些,但我試圖最小化依賴性(即到目前為止只有cv2
, numpy
和內在函數)。
謝謝!
關注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.