Python 使用cmap在opencv中保存16位图像(cv::ColorMap仅支持函数';operator()和';中cv#u 8UC1或cv#u 8UC3类型的源图像)

Python 使用cmap在opencv中保存16位图像(cv::ColorMap仅支持函数';operator()和';中cv#u 8UC1或cv#u 8UC3类型的源图像),python,numpy,opencv,matplotlib,Python,Numpy,Opencv,Matplotlib,我试图用cmap在opencv中保存/显示一个16位numpy数组(作为图像),但它不起作用。另一方面,它在matplotlib中工作顺利 我的深度学习模型提供了一个numpy数组arr()。你可以从我这里得到它 我想将其转换为其他颜色贴图: >>> arr16 = cv2.applyColorMap(arr16, cv2.COLORMAP_COOL) 它抛出以下错误: 错误:OpenCV(4.1.0)/io/OpenCV/modules/imgproc/src/color

我试图用cmap在opencv中保存/显示一个16位numpy数组(作为图像),但它不起作用。另一方面,它在matplotlib中工作顺利

我的深度学习模型提供了一个numpy数组
arr
)。你可以从我这里得到它

我想将其转换为其他颜色贴图:

>>> arr16 = cv2.applyColorMap(arr16, cv2.COLORMAP_COOL)
它抛出以下错误:

错误:OpenCV(4.1.0)/io/OpenCV/modules/imgproc/src/colormap.cpp:684: 错误:(-5:错误参数)cv::ColorMap仅支持的源图像 在函数“operator()”中键入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):

matplotlib
在显示图像之前,在内部将图像转换为32位浮点值,并且颜色贴图限制为8位(根据:

我们在标准化管道中内部转换为32位浮点,然后应用通常限制为255个值的colormap选项板,但您可以使用更多值创建自己的选项板


使用
arr8=(arr16/256).astype(np.uint8)
代替
arr8=arr16.astype(np.uint8)
。您需要将图像从
[0…65535]
适当缩放到
[0…255]
。应用颜色映射,并显示和保存(作为8位图像!)也可以在OpenCV中使用。谢谢@HansHirse,它可以使用。还有什么方法可以用cmap保存16位图像吗?恐怕不仅仅是使用OpenCV。您需要使用colormap编写自己的转换16位灰度-->16位RGB。(这并不难,但你必须自己编码。)噪音是由浮点到8比特的直接转换造成的。您应该先重新缩放,然后应用转换。
>>> plt.imshow(arr16, cmap='magma')
arr8 = (arr16/256).astype(np.uint8).