Python Pillow 简明教程

Python Pillow - Identifying Colors

在图像处理及分析中,识别颜色指的是识别、分类并提取不同颜色信息的步骤。它涉及分析像素数据,以确定图像内具体的颜色或颜色模式。

Python Pillow 库为此目的提供了宝贵的工具。本教学将探讨两个基础功能,即 getcolors()getdata() ,它们在高效分析图像内颜色信息方面起着关键作用。

Identifying Colors with the getcolors() function

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

Image.getcolors(maxcolors=256)

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

Example

此示例使用 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

对于需要更多灵活性或在处理不同颜色模式的图像时的场景,结合使用 Image.getdata() 函数和其它 Python 库可能是一种更方便的做法。

Identifying Colors with the getdata() function

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

Image.getdata(band=None)

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

Example

以下是一个示例,它使用 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

Example

以下示例使用 Image.getdata() 函数和 Python 集合库识别图像中出现频率最高的颜色并统计其出现次数。

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