【问题标题】:Convert grayscale 2D numpy array to RGB image将灰度 2D numpy 数组转换为 RGB 图像
【发布时间】:2021-04-02 23:01:21
【问题描述】:

我有一个灰度“TIF”图像,我将其读取为 2D 的 numpy 数组

我的二维数组中像素强度范围为 17 到 317。

我有两个挑战

  1. 将此二维数组转换为 RGB 图像

  2. 将像素强度(17 到 317 之间)缩放为 RGB 值,并将灰度图像显示为 RGB 彩色图像

很遗憾,我不能使用 Opencv 和 Matplotlib 作为我正在处理的最终产品不支持这些

【问题讨论】:

  • 也许您可以共享您的 TIF - 如果您无法在此处上传,请使用 Dropbox 或 Google Drive。您希望结果为 PNG、JPEG 还是其他格式?你到底想做什么?
  • 您共享的是 8 位 PNG,而不是您所说的 16 位 TIF。如果 Stack Overflow 不允许您上传 TIF,请使用 Dropbox 或 Google Drive 或其他服务上传您的实际图片。谢谢。
  • 请说明您打算如何在不使用 OpenCV 的情况下读取 TIF 图像。你有 PIL/枕头 吗?或者您打算使用tifffile
  • Google 云端硬盘映像的访问被拒绝。
  • 您好 Marksetchell,我已将 tif 图像上传到 Google 驱动器。请在下面找到链接。您可以使用 imageJ 软件对其进行可视化。否则在 python from PIL import Image , image.show() 我们可以可视化图像。谢谢你。 drive.google.com/file/d/1v_S5CnoCm9dp40XsJkeR8I7eBKUNVeUk/…

标签: python image numpy rgb grayscale


【解决方案1】:

在我看来,您的问题有 3 个方面:

  • 创建颜色图或 LUT “查找表”
  • 将像素缩放到标准范围
  • 在没有matplotlib 的情况下将颜色图应用于图像。

因此,要创建颜色图,我们需要一个包含 256 个 RGB 值的列表,其中 我们可以查找任何灰度值并找到我们想要显示的颜色。我知道您不能在生产中使用matplotlib,但您可以在其他机器上从那里获取一两个颜色图并将其复制到您的生产机器上。所以,让我们这样做。我们将采用viridis 颜色映射:

#!/usr/bin/env python3

import numpy as np
from matplotlib import cm

# Get 256 entries from "viridis" or any other Matplotlib colormap
colmap = cm.get_cmap('viridis', 256)

# Make a Numpy array of the 256 RGB values
# Each line corresponds to an RGB colour for a greyscale level
np.savetxt('cmap.csv', (colmap.colors[...,0:3]*255).astype(np.uint8), fmt='%d', delimiter=',')

如果我们查看那个文件 "cmap.csv",它有 256 行,开头是这样的:

68,1,84
68,2,85
68,3,87
69,5,88
69,6,90
69,8,91
70,9,92
...
...

这意味着我们在灰度图像中看到0 的任何地方,我们实际上为像素rgb(68,1,86) 着色。我们在灰度中看到1 的任何地方都映射到rgb(68,2,85)。大概您可以将该文件复制到您的生产机器上,您可以选择Matplotlibs colormaps 中的任何一个。


关于缩放,您发布了一个范围为 0..117 的 8 位 PNG 图像,而不是一个范围为 17..317 的 16 位 TIFF 图像,所以这不是最有用的。另外,你还没有说你打算如何在没有 OpenCVma​​tplotlib 的系统上阅读 TIFF,所以我不知道你是否有 PIL/Pillow或计划使用tifffile

然后,我将创建一个范围为 17..317 的虚拟 32x32 图像,如下所示:

grey = np.random.randint(17,318, (32,32))

看起来像这样:

array([[244,  75, 237, ..., 154, 190,  70],
       [286, 247, 158, ..., 150, 267, 124],
       [170, 305, 237, ..., 126, 111, 236],
       ...,
       [163, 292, 184, ...,  24, 253, 177],
       [314,  34,  36, ...,  87, 316, 182],
       [258, 153, 278, ..., 189,  57, 196]])

如果我们现在想将其从 17..317 范围扩展到 0..255 范围,我们可以使用:

rescaled = ((grey.astype(float) - grey.min())*255/(grey.max() - grey.min())).astype(np.uint8)

这给了我们这个:

array([[192,  49, 187, ..., 116, 147,  45],
       [228, 195, 119, ..., 113, 212,  90],
       [130, 244, 187, ...,  92,  79, 186],
       ...,
       [124, 233, 141, ...,   5, 200, 136],
       [252,  14,  16, ...,  59, 254, 140],
       [204, 115, 221, ..., 146,  34, 152]], dtype=uint8) 

可以通过加载包含我们的颜色图的 CSV 文件并从颜色图中获取相应的元素来完成查找,该元素由 0...255 范围内的灰度值索引:

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Load image as greyscale and make into Numpy array
grey = np.array(Image.open('TdoGc.png').convert('L'))

# Load RGB LUT from CSV file
lut = np.loadtxt('cmap.csv', dtype=np.uint8, delimiter=',')

# Make output image, same height and width as grey image, but 3-channel RGB
result = np.zeros((*grey.shape,3), dtype=np.uint8)

# Take entries from RGB LUT according to greyscale values in image
np.take(lut, grey, axis=0, out=result)

# Save result
Image.fromarray(result).save('result.png')

如果您在读取后将灰度图像缩放到完整范围,请使用以下行:

grey = ((grey.astype(float) - grey.min())*255/(grey.max() - grey.min())).astype(np.uint8)

你会得到这个:


如果您想可视化您的颜色图,请将上面的行更改为如下所示:

grey = np.array(Image.open('TdoGc.png').convert('L'))

进入这个,以便它生成一个渐变(斜坡)图像:

grey = np.repeat(np.arange(256,dtype=np.uint8).reshape(1,-1), 100, axis=0)

然后你可以看到你的颜色图:


处理没有枚举颜色的类变量的分段线性颜色图的快速技巧。所以你可以像这样从autumn colourmap 制作cmap.csv 文件:

import numpy as np
from matplotlib import cm

# Get "autumn" colourmap
colmap = cm.get_cmap('autumn')

# Save 256 RGB entries as CSV - one for each of grey levels 0..255
np.savetxt('cmap.csv', np.array([colmap(i/255)[:3] for i in range(256)]) * 255, fmt="%d", delimiter=',')

【讨论】:

  • 您好,mark Setchell,非常感谢您的支持。我已经为此苦苦挣扎了将近 2 周。再次感谢。我现在可以获得彩色 RGB 图像。我有一个问题,如果我想让它成为秋天或其他颜色图。它不工作。我只能使用连续的颜色图。请提出使用其他颜色图的方法。
  • 感谢增益帮助我
  • 哦,对不起。我只是选择了最流行(和默认)的颜色图并没有测试其他颜色图,因为我自己从不使用matplotlib :-) 我会看看我是否可以为autumn等其他颜色图找到一种方法。
  • 我在底部为autumn 颜色图添加了一些内容。请再看看。
  • 谢谢。非常有用。
猜你喜欢
  • 2016-08-16
  • 2014-06-02
  • 2014-02-26
  • 2014-12-22
  • 2021-08-20
  • 2017-06-17
  • 2013-10-25
  • 1970-01-01
相关资源
最近更新 更多