【问题标题】:convert a 2D numpy array with positive and negative values, into an RGB images将具有正值和负值的 2D numpy 数组转换为 RGB 图像
【发布时间】:2020-12-18 10:09:50
【问题描述】:

enter image description here我有一个 2D numpy 数组 (128 x 128),其值为正数和负数。我想将其转换为 RGB 图像。 我的想法是图像中的每个像素都有一个根据值的颜色(例如,负值具有蓝色和红色的正值颜色)。我认为当我转换为 RGB 图像时这将是自动的,但它一直是灰色的。链接中的图像是一个示例,它是灰度的,但我想添加颜色

image = (image - image.min()) / (image.max() - image.min()) #to normalize
image = (image * 255).astype(np.uint8)
image = Image.fromarray(image, 'L').convert('RGB')

【问题讨论】:

标签: python numpy python-imaging-library


【解决方案1】:

从灰度图像转换为 RGB 图像时,每个像素值都会重复。所以它看起来仍然像灰度图像。

我将简要地向您展示一个示例。

import cv2
import numpy as np
from matplotlib import pyplot as plt

image = np.random.rand(28, 28)
image = (image - image.min()) / (image.max() - image.min()) #to normalize
image = (image * 255).astype(np.uint8)

print(image[0][0]) #100

image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)

image[0][0] #[100, 100, 100]

归一化灰度图像的第一个像素值为100。 转换为 RGB 后的第一个值为 [100, 100, 100]。

添加使用 HSV 的示例

import cv2
import numpy as np
image = np.random.rand(28, 28)
image = (image - image.min()) / (image.max() - image.min()) #to normalize
image = image * 120 #you can modify range of H for HSV
image = np.expand_dims(image, 2)

sv = np.zeros([28, 28, 2])
sv[:, :, 0] = 200 #you can modify value of S for HSV
sv[:, :, 1] = 100 #you can modify value of V for HSV

hsv_image = np.concatenate([image, sv], 2).astype(np.uint8)
rgb_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)

然后你可以得到颜色从红色到蓝色的RGB图像。

【讨论】:

  • 谢谢你的解释,所以我不应该先转换成灰度?
  • 我认为使用 HSV 颜色空间而不是图像的最小值到最大值来规范化蓝色和红色值会更好。然后将其转换为 RGB 颜色空间。
  • 你能举个例子吗?
  • @kascodegama1 我添加了示例。您可以修改引用 HSV 颜色空间的值。
【解决方案2】:
import numpy as np
import matplotlib.pyplot as plt

#"image" holds your 2D image data. np.shape(image) = 128 x 128

plt.imshow(image, interpolation='none')
plt.colorbar()
plt.show()
plt.savefig('image.pdf')

【讨论】:

  • 这应该被扩展,我不是很喜欢使用matplotlib,它允许颜色的“线性化”,你可以选择和制作你自己的配色方案
  • 请在你的答案中包含一些文字描述(不仅仅是代码)
  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。