[英]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
我想將其轉換為其他顏色圖:
>>> 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)
另一方面,使用 matplotlib, cmap
可以正常工作,如下所示:
>>> plt.imshow(arr16, cmap='magma')
我的問題是:如何使用 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.