Python – 使用Pillow进行颜色反转
颜色反转(图像负片)是对图像的像素值进行反转的方法。图像反转并不取决于图像的颜色模式,即反转是在通道层面上进行的。当反转用于多色图像(RGB、CMYK等)时,每个通道被单独处理,最后的结果是通过校准所有通道的结果形成的。
我们将使用pillow(PIL)库来获取图像的底片。要安装该库,请在命令行中执行以下命令:-
注意:几个Linux发行版往往都预装了Python和PIL。
在这篇文章中,描述了2种方法来反转图像的颜色空间。第一种是使用ImageChops.invert()函数的内建方法。在第二种方法中,我们将通过像素值的元素减法来反转图像。
样本图片 –
方法#1:
使用内置的ImageChops.invert()方法来否定颜色。
输出:
解释:
首先,我们导入ImageChops模块以使用invert()方法。然后我们打开测试图像(test.jpg),并保存它的图像对象。现在我们把这个图像对象传给ImageDraw.invert(),它返回倒置的图像。最后,我们显示了倒置后的图像。
使用ImageChops.invert()时需要注意的事项。
- 输入的图像不应包含Alpha通道
-
输入的图像不应该是P(Paletted)颜色模式。
方法#2:
用于获得图像反转的方法是用一个像素的最大值/强度减去当前像素的值。结果值由公式指导 –
其中INV是反转后的像素,I^MAX是给定颜色模式下的最大强度水平,I(x, y)是图像/颜色通道在特定一对坐标上的强度(像素值)。
输出:
解释:
首先,我们在代码中导入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)。