Python – 使用 Pillow 进行频道丢弃
通道删除是一种去除多通道图像的一个通道的方法。移除意味着将特定通道的颜色值变为 0(所有像素),即该特定通道对最终图像没有任何影响(假设颜色是“正常”混合的)。丢弃颜色通道时遵循颜色理论(色轮)。删除通道后,将添加其他通道的值以创建新图像。这种方法广泛用于图像处理包,如 Adobe Photoshop、Gimp 等。
我们将使用pillow
库来实现通道丢弃。要安装库,请在命令行中执行以下命令:
pip install pillow
在后面的一种方法中,我们将利用 numpy 库提供的元素操作。要安装numpy
,请在命令行中执行以下命令:
pip install numpy
方法一:
在这种方法中,我们将使用作为参数传递给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
中。然后我们用值填充我们的变换矩阵( matrix
变量),这将导致从图像中删除绿色通道。因为,绿色通道已从图像中移除(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,因此保留了所有颜色通道。
方法二:
在这种方法中,我们将使用 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 数组。之后,我们使用img_arr[::, ::, 2] = 0
将 0 分配为蓝色通道中每个像素的值,这意味着给这个多通道矩阵的第三个通道(蓝色)的每一行和每一列 a值为 0。然后我们使用这个数组使用Image.fromarray()
创建一个新图像。最后,我们展示了图像。
注意:第三个参数中的2被视为蓝色通道(第三通道)的原因是因为 numpy 使用基于 0 的索引,因此第一个元素位于索引 0 而不是 1,因此使索引 2 处的元素成为第三个元素.