【问题标题】:Python Grayscale image to RGBPython灰度图像到RGB
【发布时间】:2020-05-26 20:19:35
【问题描述】:

我有一个灰度图像作为具有以下属性的 numpy 数组

shape = ( 3524, 3022), dtype = float32, min = 0.0, max = 1068.16

绘制为plt.imshow( gray, cmap = 'gray, vmin = 0, vmax = 80)的灰色图像看起来像这样,

我想将其转换为 RGB。我尝试了几种方法,例如np.stack、cv2.merge、cv2.color 创建 3D np.zeros 图像并将灰度图像分配给每个通道。当我绘制 3D 图像时,我得到一个非常暗淡的图像,根本看不到“斑点”。我也尝试将其范围转换为 [0, 1] 或 [0, 255 ] 范围无效。

使用 np.stack plt.imshow( np.stack(( new,)*3, axis = 2)),我得到了这个,

我该怎么办?提前致谢!

【问题讨论】:

    标签: python opencv matplotlib grayscale imshow


    【解决方案1】:

    标准化图像的一种方法是使用带有 norm_type=cv2.NORM_MINMAX 的 cv2.normalize。它会将您的数据拉伸或压缩到 0 到 255 的范围内(使用 alpha 和 beta 参数)并保存为 8 位类型。

    # normalize
    norm = cv2.normalize(gray, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    print(norm.shape, norm.dtype)
    
    # convert to 3 channel
    norm = cv2.cvtColor(norm, cv2.COLOR_GRAY2BGR)
    print(norm.shape, norm.dtype)
    print(np.amin(norm),np.amax(norm))
    

    【讨论】:

    • 最后,只除以图像的最大值,节省了一天。但是,我使用您的解决方案对一组具有不同动态范围的图像进行了标准化,以实现可视化。
    【解决方案2】:

    通过将vmin=0,vmax=80 传递给plt.imshow,您基本上可以剪切图像并重新缩放。所以你可以这样做:

    gray_normalized = gray.clip(0,80)/80 * 255
    
    # stack:
    rgb = np.stack([gray_normalized]*3, axis=2)
    
    cv2.imwrite('output.png', gray_normalized)
    

    【讨论】:

    • 谢谢,使用 imwrite() 查看保存的图像,帮助我了解了发生了什么。
    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 2014-11-29
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-12-22
    相关资源
    最近更新 更多