Python – 使用Pillow进行颜色反转

Python – 使用Pillow进行颜色反转

颜色反转(图像负片)是对图像的像素值进行反转的方法。图像反转并不取决于图像的颜色模式,即反转是在通道层面上进行的。当反转用于多色图像(RGB、CMYK等)时,每个通道被单独处理,最后的结果是通过校准所有通道的结果形成的。
我们将使用pillow(PIL)库来获取图像的底片。要安装该库,请在命令行中执行以下命令:-

pip install pillow

注意:几个Linux发行版往往都预装了Python和PIL。
在这篇文章中,描述了2种方法来反转图像的颜色空间。第一种是使用ImageChops.invert()函数的内建方法。在第二种方法中,我们将通过像素值的元素减法来反转图像。
样本图片 –

Python - 使用Pillow进行颜色反转

方法#1:
使用内置的ImageChops.invert()方法来否定颜色。

# Importing imagechops for using the invert() method
from PIL import Image, ImageChops
 
# Opening the test image, and saving it's object
img = Image.open('test.jpg')
 
# Passing the image object to invert() 
inv_img = ImageChops.invert(img)
 
# Displaying the output image
inv_img.show()

输出:

Python - 使用Pillow进行颜色反转

解释:
首先,我们导入ImageChops模块以使用invert()方法。然后我们打开测试图像(test.jpg),并保存它的图像对象。现在我们把这个图像对象传给ImageDraw.invert(),它返回倒置的图像。最后,我们显示了倒置后的图像。
使用ImageChops.invert()时需要注意的事项。

  • 输入的图像不应包含Alpha通道

  • 输入的图像不应该是P(Paletted)颜色模式。

方法#2:
用于获得图像反转的方法是用一个像素的最大值/强度减去当前像素的值。结果值由公式指导 –

Python - 使用Pillow进行颜色反转

其中INV是反转后的像素,I^MAX是给定颜色模式下的最大强度水平,I(x, y)是图像/颜色通道在特定一对坐标上的强度(像素值)。

from PIL import Image
 
# numpy for performing batch processing and elementwise
# matrix operations efficiently
import numpy as np
 
 
# Opening an image, and saving open image object
img = Image.open(r"sample.jpg")
 
# Creating an numpy array out of the image object
img_arry = np.array(img)
 
# Maximum intensity value of the color mode
I_max = 255
 
# Subtracting 255 (max value possible in a given image
# channel) from each pixel values and storing the result
img_arry = I_max - img_arry
 
# Creating an image object from the resultant numpy array
inverted_img = Image.fromarray(img_arry)
 
# Saving the image under the name Image_negative.jpg
inverted_img.save(r"Image_negative.jpg")

输出:

Python - 使用Pillow进行颜色反转

解释:
首先,我们在代码中导入numpy,因为numpy允许对矩阵进行快速的元素运算,并提供对数组的若干算术运算。然后我们用Image.open()打开测试图像,并将返回的图像对象存储在变量img中。然后,我们从打开的图像对象(img)中获得的像素值创建一个数组(img_arry)。这样做是为了允许numpy库所提供的元素减法操作。现在我们从每个通道/像素值中减去255,这将导致所有的像素值被倒置。现在,我们使用这个结果矩阵来创建一个新的图像(inverted_img)。最后我们将图像保存下来,名称为Image_negative.jpg。

要记住的一些事情 –

  • 应该确保输入的图像不包含一个阿尔法通道。这是因为当img_arry = 255 – img_arry这一行将对含有alpha通道的图像执行时,它也会反转alpha通道的值。这将导致输出图像的不一致,因为我们可能最终得到完全透明的图像(这不是颜色反转的一部分)。允许处理RGBA图像的一个方法是首先使用Image.convert(‘RGB’)将其转换为RGB颜色模式。另外,我们可以使用Image.getdata(band=3)提取阿尔法通道,然后再将其合并到最终的图像中,以取回原始的RGBA图像。
    这个输入图像sample.jpg是故意选择.jpg格式的,因为JPG/JPEG图像格式不支持透明度或alpha通道。

  • 输入的图像不应该是P(调色板)模式的。因为调色板图像不包含坐标上的像素值,而是属于一个颜色图谱(大小不一)的像素值的索引。因此,图像反转将导致不一致的结果。

  • I_max = 255这个值是假设在特定的图像模式下可实现的最大强度是255。这个值并不是硬编码的。该值取决于颜色模式,因此可能小于255(例如:双阶图像中的1)或大于255(例如:16位无符号灰度模式中的32536)。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python pil