提问之初
<small>
读取一张图片各种颜色占比
/storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg
有趣优雅热情沉着的代码与注释/每行每行
from PIL import Image # 导入PIL大法,这是处理图像的必备神器# 图片路径,此处为示例,实际应该根据具体情况修改
image_path = "/storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg"# 打开并加载图片
image = Image.open(image_path) # 打开图片文件
pixels = image.load() # 加载像素数据# 初始化颜色统计字典,用于存储颜色及其在图片中出现的次数
color_counts = {}# 遍历所有像素,并统计颜色出现次数
for i in range(image.size[0]): # 循环遍历图片的宽度for j in range(image.size[1]): # 循环遍历图片的高度color = pixels[i, j] # 获取当前像素的颜色if isinstance(color, int):# 如果当前像素为灰度图像素,则将其转换为RGB格式color = (color, color, color)if color not in color_counts: # 如果颜色不在统计字典中,则加入字典并初始化计数为1color_counts[color] = 1else: # 否则计数加1color_counts[color] += 1# 计算每种颜色在图片中的比例
threshold = 0.001 # 声明占比阈值,此值用于控制输出结果中的颜色种类
total_pixels = image.size[0] * image.size[1] # 计算总像素数
color_ratios = {}
for color, count in color_counts.items():color_ratio = count / total_pixels # 计算颜色在图片中的比例if color_ratio >= threshold: # 如果该颜色的占比超过阈值,则将其加入结果字典color_ratios[color] = color_ratio# 输出结果
if len(color_ratios) > 0:# 对结果字典按照颜色占比从大到小排序,并输出颜色及其占比for color, ratio in sorted(color_ratios.items(), key=lambda x: x[1], reverse=True):print(f'{color}: {ratio:.2%}')
else:print("图片中不存在占比大于0%的颜色")
希望这次的代码和注释能够满足您的需求,并且带给您一些乐趣。如果您还有其他问题或需要进一步的帮助,请随时告诉我。
以下是这段代码中使用的函数清单:
- Image.open(image_path)
: 打开指定路径的图片文件,并返回一个Image
对象。
- image.load()
: 返回一个像素访问对象,用于获取和修改图片的像素数据。
- isinstance(color, int)
: 检查color
是否为整数类型,用于判断像素是否为灰度图像素。
- color_counts.items()
: 返回字典color_counts
中包含的所有项。每一项是一个键值对(颜色-次数)。
- sorted(color_ratios.items(), key=lambda x: x[1], reverse=True)
: 对颜色比例字典color_ratios
进行排序,按照占比从大到小的顺序排列。key
参数表示排序的依据,这里使用lambda
表达式指定按照比例值(键值对的第二个元素)排序。reverse=True
表示降序排列。
- print(f'{color}: {ratio:.2%}')
: 格式化输出颜色及其比例。使用了f-string格式来插入变量color
和ratio
,其中: .2%
指定了比例的格式为百分数且保留两位小数。
打印结果
/data/user/0/org.qpython.qpy/files/bin/qpy thon3.sh "/storage/emulated/0/qpython/读取 一张图片各种颜色占比2.0.1.py" && exit
张图片各种颜色占比2.0.1.py" && exit < (27, 27, 37): 53.43%
(249, 249, 249): 16.25%
(255, 255, 255): 7.16%
(27, 27, 39): 2.53%
(27, 27, 35): 1.61%
(26, 26, 36): 0.93%
(28, 26, 37): 0.81%
(25, 28, 37): 0.75%
(28, 28, 38): 0.71%
(25, 27, 39): 0.54%
(242, 241, 246): 0.53%
(26, 26, 38): 0.43%
(28, 26, 39): 0.39%
(28, 28, 40): 0.33%
(28, 27, 35): 0.23%
(25, 27, 40): 0.22%
(25, 28, 35): 0.22%
(26, 26, 34): 0.21%
(27, 26, 40): 0.19%
(28, 28, 36): 0.18%
(24, 26, 38): 0.17%
(24, 27, 36): 0.17%
(26, 28, 40): 0.16%
(27, 25, 36): 0.15%
(26, 29, 38): 0.14%
(29, 27, 38): 0.13%
(248, 248, 248): 0.12%
(26, 28, 41): 0.12%
(254, 255, 255): 0.11%
(27, 28, 32): 0.10%
(25, 25, 35): 0.10%#[QPython] Press enter to exit ...