Python Pillow – 图像上的颜色
在本文中,我们将使用Python的 Pillow 模块学习图像上的颜色。让我们讨论一些概念:
- Python Imaging Library 中的一个关键类是 Image 类。它在 Image 模块中定义,并提供一个 PIL 图像,通常在其上管理操作操作。此类的实例通常以多种方式创建:通过从文件加载图像、从头开始创建图像,或作为处理其他图像的结果。我们将看到所有这些都在使用中。
- 任何图像都由像素组成,每个像素代表图像中的一个点。一个像素包含三个值,每个值的范围在 0 到 255 之间,分别代表红色、绿色和蓝色分量的数量。这些的组合形成像素的实际颜色。
- ImageColor模块包含颜色表和从 CSS3 样式颜色说明符到 RGB 元组的转换器。该模块由 PIL.Image.Image.new() 和 ImageDraw 模块等使用。
ImageColor 模块,包含各种表示颜色的格式。这些格式如下:
- 字符串:颜色也可以表示为字符串,如红色、绿色、蓝色、黄色。它们不区分大小写。
- 十六进制颜色:表示为:#rgb 或 #rrggbb。例如-#ffff00 代表黄色,其中红色为 255,绿色为 255,蓝色为 0。RGB 将是一个元组-(255,255,0)
- 圆柱形:表示为 HSL,其中 H-色调、S-饱和度和 L-亮度。例如-#ffff00 代表黄色,其中色调为 0.63,饱和度为 1.00,亮度值为 0.50。
用颜色创建图像
在这里,我们将使用 Image.new() 方法创建带有颜色的图像。
PIL.Image.new()方法创建一个具有给定模式和大小的新图像。大小以(宽度,高度)元组的形式给出,以像素为单位。对于单波段图像,颜色作为单个值给出,对于多波段图像给出一个元组(每个波段一个值)。我们也可以使用颜色名称。如果省略 color 参数,则图像填充为零(这通常对应于黑色)。如果颜色为 None,则不初始化图像。如果您要在图像中粘贴或绘制内容,这会很有用。
Syntax: PIL.Image.new(mode, size, color)
Parameters:
- mode: The mode to use for the new image. (It could be RGB, RGBA)
- size: A 2-tuple containing (width, height) in pixels.
- color: What color to use for the image. Default is black. If given, this should be a single integer or floating point value for single-band modes, and a tuple for multi-band modes.
Return Value: An Image object.
Python3
from PIL import Image
# color --> "red" or (255,0,0) or #ff0000
img = Image.new('RGB',(200,200),(255,0,0))
img.show()
Python3
# importing module
from PIL import ImageColor
# using getrgb for yellow
img1 = ImageColor.getrgb("yellow")
print(img1)
# using getrgb for red
img2 = ImageColor.getrgb("red")
print(img2)
Python3
# importing module
from PIL import ImageColor
# using getrgb for yellow
img1 = ImageColor.getcolor("yellow",'L')
print(img1)
# using getrgb for red
img2 = ImageColor.getcolor("red",'L')
print(img2)
Python3
from PIL import Image
img = Image.open("flower.jpg")
img = img.convert("RGB")
d = img.getdata()
new_image = []
for item in d:
# change all white (also shades of whites)
# pixels to yellow
if item[0] in list(range(200, 256)):
new_image.append((255, 224, 100))
else:
new_image.append(item)
# update image data
img.putdata(new_image_data)
# save new image
img.save("flower_image_altered.jpg")
输出:
将颜色字符串转换为 RGB 颜色值
使用 ImageColor 模块,我们还可以将颜色转换为 RGB 格式(RGB 元组),因为 RGB 非常方便执行不同的操作。为此,我们将使用 ImageColor.getgrb() 方法。 ImageColor.getrgb()将颜色字符串转换为 RGB 元组。如果无法解析字符串,则此函数会引发 ValueError 异常。
Syntax: PIL.ImageColor.getrgb(color)
Parameters:
- color: A color string
Returns: (red, green, blue[, alpha])
蟒蛇3
# importing module
from PIL import ImageColor
# using getrgb for yellow
img1 = ImageColor.getrgb("yellow")
print(img1)
# using getrgb for red
img2 = ImageColor.getrgb("red")
print(img2)
输出:
(255, 255, 0)
(255, 0, 0)
将颜色字符串转换为灰度值
ImageColor.getcolor()与getrgb()相同,但如果模式不是彩色或调色板图像,则将 RGB 值转换为灰度值。如果无法解析字符串,则此函数会引发 ValueError 异常。
Syntax: PIL.ImageColor.getcolor(color, mode)
Parameters:
- color – A color string
Returns: (graylevel [, alpha]) or (red, green, blue[, alpha])
蟒蛇3
# importing module
from PIL import ImageColor
# using getrgb for yellow
img1 = ImageColor.getcolor("yellow",'L')
print(img1)
# using getrgb for red
img2 = ImageColor.getcolor("red",'L')
print(img2)
输出:
226
76
通过改变像素值来改变颜色
我们还可以将图像的颜色更改为其他颜色。
输入图像:
蟒蛇3
from PIL import Image
img = Image.open("flower.jpg")
img = img.convert("RGB")
d = img.getdata()
new_image = []
for item in d:
# change all white (also shades of whites)
# pixels to yellow
if item[0] in list(range(200, 256)):
new_image.append((255, 224, 100))
else:
new_image.append(item)
# update image data
img.putdata(new_image_data)
# save new image
img.save("flower_image_altered.jpg")
输出: