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就可以删除那个特定的通道。对于我们的目的,我们不需要改变其他偏移的值,因为它们会导致不同的效果,而这是不需要的。示例图像。
代码:
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()
输出图像:
解释:首先,我们通过使用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()
输出的图像:
解释:首先,我们为我们的样本图像获得一个图像对象,并将其存储在变量img中。然后,我们使用数据类型为np.uint8(8位无符号整数)的函数np.array()将图像转换成numpy数组。之后,我们给蓝色通道的每个像素赋值为0,使用img_arr[:, ::, 2] = 0,这意味着给这个多通道矩阵的第三通道(蓝色)的每一行和每一列赋值为0。最后,我们显示了这个图像。
注意:第三个参数中的2被视为蓝色通道(第三通道)的原因是numpy使用了基于0的索引,由于第一个元素的索引是0而不是1,因此索引2的元素成为第三个元素。