Python – 使用Pillow去除多通道图像中的一个通道

Python – 使用Pillow去除多通道图像中的一个通道

通道删除是一种去除多通道图像中的一个通道的方法。去除的意思是把某个通道的颜色值变成0(所有像素),也就是说,这个通道对最终的图像没有任何影响(假设颜色是 “正常 “混合的)。在删除颜色通道时要遵循色彩理论(色轮)。一旦一个通道被删除,其他通道的值就会被添加到新的图像中。这种方法在图像处理包中被广泛使用,如Adobe Photoshop、Gimp等。我们将使用pillow库来实现通道删除。要安装这个库,在命令行中执行以下命令。

pip install pillow

在后面的方法中,我们将利用numpy库提供的元素运算。要安装numpy,在命令行中执行以下命令。

pip install numpy

方法1:在这个方法中,我们将使用作为参数传递给Image.convert()的变换矩阵。变换矩阵是。

newRed   = 1*oldRed  +  0*oldGreen  +  0*oldBlue  + constant
newGreen = 0*oldRed  +  1*OldGreen  +  0*OldBlue  + constant
newBlue  = 0*oldRed  +  0*OldGreen  +  1*OldBlue  + constant

一个正常的RGB图像会有一个如上所示的矩阵。

(1, 0, 0, 0,
 0, 1, 0, 0,
 0, 0, 1, 0)

在上面的矩阵中,把1改为0就可以删除那个特定的通道。对于我们的目的,我们不需要改变其他偏移的值,因为它们会导致不同的效果,而这是不需要的。示例图像。

Python - 使用Pillow去除多通道图像中的一个通道

代码:

from PIL import Image
 
# Creating a image object, of the sample image
img = Image.open(r'sample.jpg')
 
# A 12-value tuple which is a transform matrix for dropping
# green channel (in this case)
matrix = ( 1, 0, 0, 0,
           0, 0, 0, 0,
           0, 0, 1, 0)
 
# Transforming the image to RGB using the aforementioned matrix
img = img.convert("RGB", matrix)
 
# Displaying the image
img.show()

输出图像:

Python - 使用Pillow去除多通道图像中的一个通道

解释:首先,我们通过使用Image.open()打开图像来创建图像对象,然后在变量img中保存返回对象。然后我们用数值填充我们的转换矩阵(矩阵变量),这将导致绿色通道从图像中被移除。由于绿色通道从图像中被移除(null’d),最终图像的像素值将取决于图像的红色和蓝色通道(给出品红色的阴影,因为红色+蓝色=品红色)。然后我们将转换矩阵发送到convert()方法中,并保存了返回的图像。最后,我们用img.show()显示图像。同样的效果可以应用在多个通道上,通过将几个1改为0。

例子:同样的代码,但有矩阵。

matrix = ( 0, 0, 0, 0,
           0, 0, 0, 0,
           0, 0, 1, 0)

这是一个红色和绿色通道被删除的图像(因为它们的位置值是0)。由于这个原因,所得到的图像是蓝色的。同样的代码与矩阵。

matrix = ( 1, 0, 0, 0,
           0, 1, 0, 0,
           0, 0, 1, 0)

因为所有的位置值都是1,所以所有的颜色通道都被保留下来。方法2:在这个方法中,我们将使用numpy库提供的元素乘法操作(在我们的例子中是广播),来否定图像的一个颜色通道。代码。

from PIL import Image
import numpy as np
 
# Opening the test image and saving its object
img = Image.open(r'sample.jpg')
 
# Creating an array out of pixel values of the image
img_arr = np.array(img, np.uint8)
 
# Setting the value of every pixel in the 3rd channel to 0
# Change the 2 to 1 if wanting to drop the green channel
# Change the 2 to 0 if wanting to drop the red channel
img_arr[::, ::, 2] = 0
 
# Creating an image from the modified array
img = Image.fromarray(img_arr)
 
# Displaying the image
img.show()

输出的图像:

Python - 使用Pillow去除多通道图像中的一个通道

解释:首先,我们为我们的样本图像获得一个图像对象,并将其存储在变量img中。然后,我们使用数据类型为np.uint8(8位无符号整数)的函数np.array()将图像转换成numpy数组。之后,我们给蓝色通道的每个像素赋值为0,使用img_arr[:, ::, 2] = 0,这意味着给这个多通道矩阵的第三通道(蓝色)的每一行和每一列赋值为0。最后,我们显示了这个图像。

注意:第三个参数中的2被视为蓝色通道(第三通道)的原因是numpy使用了基于0的索引,由于第一个元素的索引是0而不是1,因此索引2的元素成为第三个元素。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python pil