kHa*_*hit 4 python opencv numpy matplotlib
我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)
我想将其转换为其他颜色图:
>>> arr16 = cv2.applyColorMap(arr16, cv2.COLORMAP_COOL)
Run Code Online (Sandbox Code Playgroud)
它抛出以下错误:
错误: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)
Run Code Online (Sandbox Code Playgroud)
另一方面,使用 matplotlibcmap可以正常工作,如下所示:
>>> plt.imshow(arr16, cmap='magma')
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何使用 cmap 在 opencv 中保存/显示 16 位图像?
绘图时 8 位图像中的噪声是由于缩放不当造成的。它可以通过以下方式从 16 位([0 ... 65535]到 8 位)缩放(感谢评论中的@HansHirse):[0 ... 255]
arr8 = (arr16/256).astype(np.uint8).
Run Code Online (Sandbox Code Playgroud)
matplotlib在显示之前将图像内部转换为 32 位浮点数,并且颜色图限制为 8 位(根据github 问题):
我们在标准化管道中内部转换为 32 位浮点数,然后应用颜色图调色板,该调色板通常限制为 255 个值,但您可以使用更多值创建自己的调色板。