📜  Python – 使用 Pillow 进行频道丢弃

📅  最后修改于: 2022-05-13 01:54:23.521000             🧑  作者: Mango

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 处的元素成为第三个元素.