繁体   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