簡體   English   中英

使用 cmap 在 opencv 中保存 16 位圖像(cv::ColorMap 僅支持函數“operator()”中類型為 CV_8UC1 或 CV_8UC3 的源圖像)

[英]Saving 16-bit image in opencv with cmap (cv::ColorMap only supports source images of type CV_8UC1 or CV_8UC3 in function 'operator()')

我正在嘗試使用 cmap 在 opencv 中保存/顯示一個 16 位 numpy 數組(作為圖像),但它不起作用。 另一方面,它在 matplotlib 中運行流暢。

我的深度學習模型給出了一個 numpy 數組arr ( <class 'numpy.ndarray'> )。 你可以從這里得到它。

# np array predicted from a depth model
>>> arr16 = np.load('pred_depth_scale.npy')
>>> arr16.dtype, arr16.shape
(dtype('uint16'), (466, 492))
>>> cv2.imshow('img', arr16)
# shows image in grayscale

uint16_cv2_imshow

我想將其轉換為其他顏色圖:

>>> arr16 = cv2.applyColorMap(arr16, cv2.COLORMAP_COOL)

它引發以下錯誤:

錯誤: OpenCV(4.1.0) /io/opencv/modules/imgproc/src/colormap.cpp:684: 錯誤: (-5:Bad argument) cv::ColorMap 僅支持函數中的 CV_8UC1 或 CV_8UC3 類型的源圖像操作員()'

現在,如果我將圖像轉換為uint8 ,則圖像包含噪聲。

>>> arr8 = arr16.astype(np.uint8)
>>> arr8 = cv2.applyColorMap(arr8, cv2.COLORMAP_COOL)
>>> cv2.imshow('img', arr8)

uint8_cv2_imshow

另一方面,使用 matplotlib, cmap可以正常工作,如下所示:

>>> plt.imshow(arr16, cmap='magma')

uint16_plt_imshow

我的問題是:如何使用 cmap 在 opencv 中保存/顯示 16 位圖像?

繪圖時 8 位圖像中的噪聲是由於縮放不當造成的。 它可以通過以下方式從 16 位( [0 ... 65535]到 8 位[0 ... 255]縮放(感謝@HansHirse 在評論中)

arr8 = (arr16/256).astype(np.uint8).

matplotlib在顯示之前在內部將圖像轉換為 32 位浮點數,並且顏色圖僅限於 8 位(根據github 問題):

我們在規范化管道中內部轉換為 32 位浮點數,然后應用通常限制為 255 個值的顏色圖調色板,但您可以使用更多值創建自己的調色板。

暫無
暫無

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

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