Python PIL图像分割为RGB。

5
如何将图像拆分为RGB颜色,为什么split()函数无法正常工作?
from PIL import Image
pil_image = Image.fromarray(some_image)
red, green, blue = pil_image.split()
red.show()

为什么red.show()显示的是灰度图像而不是红色图像?同样的情况也适用于green.show()blue.show()

所有的“split”通道都只是特定通道的值,因此在显示时它们都呈现为灰度。 - John Anderson
3个回答

16

我创建了一个脚本,它可以接收RGB图像并通过抑制我们不想要的颜色通道来为每个通道创建像素数据。

RGB转换为R__ -> red.png

RGB转换为_G_ -> green.png

RGB转换为__B -> blue.png

from PIL import Image

img = Image.open('ra.jpg')
data = img.getdata()

# Suppress specific bands (e.g. (255, 120, 65) -> (0, 120, 0) for g)
r = [(d[0], 0, 0) for d in data]
g = [(0, d[1], 0) for d in data]
b = [(0, 0, d[2]) for d in data]

img.putdata(r)
img.save('r.png')
img.putdata(g)
img.save('g.png')
img.putdata(b)
img.save('b.png')

enter image description here enter image description here enter image description here enter image description here


1
一张单通道图像始终显示为灰度。如果您希望以本机颜色显示(即红色"R"通道、蓝色"B"通道、绿色"G"通道),则需要连接三个通道并将不感兴趣的通道置零。记得保持通道顺序,以免得到红色"G"通道。

可能更容易的方法是简单地复制图像的三个副本并将不相关的通道置零,而不是使用split。


我看到了这样的代码: plt.imshow(red, cmap="Reds") plt.show() 他用pyplot可以正常运行,而我只有灰度图。 - yeyugelire

1
你可以使用OpenCV或Pillow,两者都很简单。我已经写了一个类(使用Pillow,https://github.com/mujeebishaque/image-splitter),你可以利用并通过调用函数获得所有通道保存在当前目录中。
在OpenCV中,你可以使用split()方法来获取RGB或RGBA通道。

所有的频道看起来都有点相似,所以一旦你将它们保存下来,把它们看作缩略图,你就会注意到它们之间的区别。 - Mujeeb Ishaque

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