如何获取图像的红色通道颜色空间?

6

我正在尝试获取图像的红色通道颜色空间,目前我的方法是获得一张灰度图像:

img = img[:,:,2]

但是我想要这样的一张图片:

enter image description here

上面的图片是红色通道颜色空间图像,下面的是原始图像。到底是通过什么方式实现了这个效果?

我也尝试过

img[:,:,0] = 0
img[:,:,1] = 0

但是所得到的结果并不如预期。这里有一篇关于红色通道颜色空间的文章:https://en.wikipedia.org/wiki/RG_color_space

你可能只需要在原始的BGR图像中将蓝色通道设置为0:img[:,:,0] = 0 - Miki
我尝试了一下,但结果与imgur链接中的结果非常不同。 - user4414636
1
在我看来,被移除的颜色通道不是红色通道,而是绿色和蓝色的混合。我建议您在InkScape(或任何其他图片处理软件)中打开图像,并调整颜色级别。一旦确定了正确的组合,就可以删除剩余部分。 - Crolle
我的猜测也是,你的第一张图像是使用色彩映射计算出来的。你从哪里得到了那张第一张图片? - Micka
2个回答

1
你的第二个建议应该抛弃蓝色和绿色,给你一个“红色通道图像”。如果你想要一个RG(红绿)颜色空间图像,只需抛弃蓝色通道即可。
img[:,:,0] = 0

但是,你发布的示例图像并没有说明这一点,因为结果图像在所有三个通道中都保留了信息。我猜想它是用“颜色映射”生成的,其中不同的颜色代表原始图像中不同的红色值。这样的映射可以看起来任何你喜欢的方式,所以从你的示例图像中重建它并不容易。

1
实际上,您期望的输出图像不是原始图像的红色通道颜色空间。它是应用于输入图像的一种COLORMAP。好消息是OpenCV提供了多个内置的colormaps。坏消息是OpenCV的内置colormaps无法生成您期望的输出。但是不要放弃,您可以使用自定义查找表使用cv2.LUT()函数映射颜色。
为了更好地演示,这里有一些使用您的图像的示例:
img = cv2.imread('origin.png')
im_color = cv2.applyColorMap(img, cv2.COLORMAP_HSV)
cv2.imshow('mapped_image', im_color)
# cv2.imwrite('result.png', im_color)
cv2.waitKey(0)

enter image description here

这里是所有OpenCV的颜色映射(COLORMAP):
print [sub for sub in dir(cv2) if sub.startswith('COLORMAP_')]
['COLORMAP_AUTUMN', 'COLORMAP_BONE', 'COLORMAP_COOL', 'COLORMAP_HOT', 'COLORMAP_HSV', 'COLORMAP_JET', 'COLORMAP_OCEAN', 'COLORMAP_PINK', 'COLORMAP_RAINBOW', 'COLORMAP_SPRING', 'COLORMAP_SUMMER', 'COLORMAP_WINTER']

使用自定义查找表进行颜色映射的示例,使用cv2.LUT()

table = np.array([( i * invert_value) for i in np.arange(256)]).astype("uint8")
cv2.LUT(image, table)

很好。但是cv2.LUT()会给我一个数组,我应该构建一个颜色映射表还是什么?如果不需要,那么cv2.LUT()的输出数组有什么用处? - user4414636
@stack 每个图像都是一个数组 :-) 但是您需要将其转换为适当的类型,以便OpenCV能够将其识别为图像。让我用一个例子来更新答案。 - Mazdak
@stack 还要注意,您可能需要对其中一个内置的“COLORMAP”结果进行一些处理,以将其转换为您期望的结果。 - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接