使用Python映像库隔离单个通道

使用Python映像库隔离单个通道,python,python-imaging-library,Python,Python Imaging Library,假设我有一个图像,我想让它只显示红色通道,图像看起来是红色的,我该如何使用PIL来实现这一点?谢谢。我找到了答案。我不应该使用im.split()(将波段转换为灰度),而是应该将图像转换为数组,将不需要的波段乘以0,然后将其返回到图像对象 导入Image和numpy时,我执行了以下操作: a = Image.open("image.jpg") a = numpy.array(a) a[:,:,0] *=0 a[:,:,1] *=0 a = Image.fromarray(a) a.show()

假设我有一个图像,我想让它只显示红色通道,图像看起来是红色的,我该如何使用PIL来实现这一点?谢谢。

我找到了答案。我不应该使用im.split()(将波段转换为灰度),而是应该将图像转换为数组,将不需要的波段乘以0,然后将其返回到图像对象

导入Image和numpy时,我执行了以下操作:

a = Image.open("image.jpg")
a = numpy.array(a)
a[:,:,0] *=0
a[:,:,1] *=0
a = Image.fromarray(a)
a.show()

这将显示一个蓝色图像。

您可以使用PIL中的
image.split()
操作将图像分割为多个波段:

img = Image.open("image.jpg")
red, green, blue = img.split()

如果图像具有alpha通道(RGBA),分割函数将传统地返回该通道。更多信息。

这里晚些时候,因为我们要处理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)

对于希望从图像中提取单个通道的人(与生成具有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()

我不认为我们是在和numpy打交道,OP问的是PIL