Python Pillow - 颜色识别



在图像处理和分析的背景下,识别颜色是指识别、分类和提取不同图像上的颜色信息的过程。它涉及分析像素数据以确定图像中特定的颜色或颜色模式。

Python Pillow 库为此目的提供了有价值的工具。本教程探讨了两个基本函数,即getcolors()getdata(),它们在有效分析图像中存在的颜色信息方面起着至关重要的作用。

使用 getcolors() 函数识别颜色

getcolors() 函数返回图像中使用的颜色列表,颜色以图像的模式表示。例如,在 RGB 图像中,该函数返回一个包含红色、绿色和蓝色颜色值的元组。对于基于调色板 (P) 的图像,它返回调色板中颜色的索引。使用此函数的语法如下:

Image.getcolors(maxcolors=256)

其中,maxcolors 参数用于指定要检索的最大颜色数。它返回一个未排序的元组列表,每个元组包含出现次数和相应的颜色像素值。如果超过此 maxcolors 限制,则该方法返回 None(默认限制:256 种颜色)。

示例

此示例使用Image.getcolors() 函数识别图像中最常见的颜色。它从图像中提取前 10 种最常见的颜色,并创建一个调色板来可视化和显示这些颜色及其各自的计数。

from PIL import Image, ImageDraw

# Open an image
input_image = Image.open('Images/colorful-shapes.jpg')

# Get the palette of the top 10 most common colors
palette = sorted(input_image.getcolors(maxcolors=100000), reverse=True)[:10]

cols = 2
rows = ((len(palette) - 1) // cols) + 1
cellHeight = 70
cellWidth = 200
imgHeight = cellHeight * rows
imgWidth = cellWidth * cols

result_image = Image.new("RGB", (imgWidth, imgHeight), (0, 0, 0))
draw = ImageDraw.Draw(result_image)

for idx, (count, color) in enumerate(palette):
   y0 = cellHeight * (idx // cols)
   y1 = y0 + cellHeight
   x0 = cellWidth * (idx % cols)
   x1 = x0 + (cellWidth // 4)
   
   draw.rectangle([x0, y0, x1, y1], fill=color, outline='black')
   draw.text((x1 + 1, y0 + 10), f"Count: {count}", fill='white')

# Display the input image
input_image.show('Input Image')

# Display the color chart
result_image.show('Output identified Colors')

输入图像

colorful shapes

输出识别的颜色

color chart
需要注意的是,当图像中的颜色数量大于 maxcolors 参数时,getcolors() 函数返回 None。它主要适用于“RGB”图像,这可能并非适用于所有用例。

对于需要更多灵活性或处理不同颜色模式的图像的情况,结合使用Image.getdata() 函数和其他 Python 库可能更方便。

使用 getdata() 函数识别颜色

getdata() 函数是 Pillow Image 模块中的另一个函数,它允许用户访问图像的内容作为包含像素值的序列对象。序列对象是扁平化的,这意味着每一行的值都直接跟在零行的值之后,依此类推。虽然此方法返回的序列对象是 Pillow 的内部数据类型,但它只能支持某些序列操作,例如 Python 列表,以便更方便地进行操作和打印。以下是函数的语法:

Image.getdata(band=None)

参数band 用于指定要返回的波段(默认值:所有波段)。要检索单个波段,请提供索引值(例如,从“RGB”图像中获取“R”波段,则提供 0)。该函数返回一个类似序列的对象,可以将其转换为更熟悉的数据结构以进行进一步处理。

示例

这是一个示例,它使用 Image.getdata() 函数识别图像中的颜色并计算每种颜色的出现次数。

from PIL import Image
from collections import defaultdict

# Open an imagefrom PIL import Image
from collections import defaultdict

# Open an image
im = Image.open('Images/sea1.jpg')

# Create a defaultdict to store color counts
colors = defaultdict(int)

# Iterate through the image pixels and count each color
for pixel in im.getdata():
    colors[pixel] += 1

# Sort the colors by count in descending order
ordered_colors = sorted(colors.items(), key=lambda x: x[1], reverse=True)

# Print the top 10 colors and their counts
for color, count in ordered_colors[:10]:
    print(f"Color: {color}, Count: {count}")
from PIL import Image
from collections import defaultdict

# Open an image
im = Image.open('Images/sea1.jpg')

# Create a defaultdict to store color counts
colors = defaultdict(int)

# Iterate through the image pixels and count each color
for pixel in im.getdata():
    colors[pixel] += 1

# Sort the colors by count in descending order
ordered_colors = sorted(colors.items(), key=lambda x: x[1], reverse=True)
# Print the top 10 colors and their counts
for color, count in ordered_colors[:10]:
    print(f"Color: {color}, Count: {count}")

im = Image.open('Images/sea1.jpg')

# Create a defaultdict to store color counts
colors = defaultdict(int)

# Iterate through the image pixels and count each color
for pixel in im.getdata():
   colors[pixel] += 1

# Sort the colors by count in descending order
ordered_colors = sorted(colors.items(), key=lambda x: x[1], reverse=True)

# Print the top 10 colors and their counts
for color, count in ordered_colors[:10]:
   print(f"Color: {color}, Count: {count}")

输出

Color: (255, 255, 255), Count: 82
Color: (0, 33, 68), Count: 73
Color: (0, 74, 139), Count: 71
Color: (0, 78, 144), Count: 69
Color: (0, 77, 143), Count: 62
Color: (0, 63, 107), Count: 59
Color: (0, 34, 72), Count: 56
Color: (0, 36, 72), Count: 52
Color: (0, 30, 58), Count: 51
Color: (1, 26, 56), Count: 51

示例

下面的示例使用 Image.getdata() 函数和 Python collections 库来识别图像中最常见的颜色并计算该颜色的出现次数。

from PIL import Image
from collections import Counter

# Open an image
image = Image.open('Images/Road.jpg')

# Get a Counter dictionary of colors and their frequencies
colors = Counter(image.getdata())

# Get a set of unique colors
unique_colors = set(colors)

# Get the number of unique colors
num_unique_colors = len(unique_colors)

# Get the color with the highest frequency
most_frequent_color = max(colors, key=colors.get)

print(f"Unique Colors: {num_unique_colors}")
print(f"Most Frequent Color: {most_frequent_color} with a frequency of {colors[most_frequent_color]}")

输出

Unique Colors: 18323
Most Frequent Color: (26, 27, 31) with a frequency of 5598
广告