使用Python Imaging Library来隔离单个通道。

9

假设我有一张图片,我想让它只显示红色通道,使图像呈现红色,我该如何使用PIL实现?谢谢。

4个回答

16
您可以使用PIL中的Image.split()操作将图像分离成不同的波段:
img = Image.open("image.jpg")
red, green, blue = img.split()
如果图像具有alpha通道(RGBA),split函数还会额外返回它。更多信息请参见此处

8
我找到了答案。我应该把图片转化为一个数组,将我不需要的波段乘以0,然后再将其转化回一个图片对象,而不是使用 im.split() 将带宽转化为灰度。
引入 Image 和 numpy,我做了以下操作:
a = Image.open("image.jpg")
a = numpy.array(a)
a[:,:,0] *=0
a[:,:,1] *=0
a = Image.fromarray(a)
a.show()

这将展示一张蓝色的图片。


2

虽然时间有点晚,但由于我们正在处理numpy,因此可以使用布尔索引。

def channel(img, n):
    """Isolate the nth channel from the image.

       n = 0: red, 1: green, 2: blue
    """
    a = np.array(img)
    a[:,:,(n!=0, n!=1, n!=2)] *= 0
    return Image.fromarray(a)

1
我认为我们没有涉及到numpy,OP是在询问PIL。 - Monica Heddneck

1

如果您想从图像中提取一个单独的通道(而不是生成具有R、G和B通道的图像,但G和B通道全部为零),可以执行以下操作:

img = Image.open("image.jpg")
red = img.getchannel('R')
# OR
red = img.getchannel(0)  # Avoids internal lookup of 'R' in img.getbands()

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