ISEE小语
古语有云:“人闲是非多,百忙解千愁。”
在Python中要分析一张图片中有几种颜色,并呈现到Excel表格中统计出来。
接下来我们看一下具体的实现。
环境:
Pycharm
Python 3.9.16
安装:
本次我们用到了两个三方包协助,一个是“openpyxl”,另一个是“pillow”。
用以下方式可自行安装:
pip install pillow==10.3.0
pip install openpyxl==3.1.3
先看实际效果
准备一张图片
首先,准备一张所要分析的图片,以下是实例中所用到的:
实现原理
主要实现步骤:
读取图片:确保图片是在RGB模式下计数每种颜色的像素数。
转换颜色编码:将RGB颜色转换为颜色编号。
保存Excel:将颜色编码及呈现的颜色,一一对应保存到Excel中。
读取图片
首先,将准备的图片命名为image.png,放在当前文件夹下
然后,加载图片、读取所有像素、去重相同颜色,这个时候会打印出图片中所有的颜色和它们各自的计数,包括非常微小的变化,因为它是基于像素级的颜色读取。
from PIL import Image
from collections import Counter
# 加载图片
image_msg = Image.open('image.png')
# 将图片转换为RGB模式
image_msg = image_msg.convert('RGB')
# 获取图片中的所有像素
all_pixels = list(image_msg.getdata())
# 计算每种颜色的出现次数
color_counts = Counter(all_pixels)
# 去重后的颜色列表转换为集合
RGB_colors_ = set(color_counts.keys())
# 打印去重后的颜色
print(f'所有的颜色值: {RGB_colors_}')
(左右滑动查看完整代码)
结果:
其实很多数字,其实也看不明白,不用担心,这个只是颜色值。
接下来就是需要将这些颜色值转换为颜色编号。
转换颜值编码
我们将以上的颜色值转换为颜色编码
在示例中为了更清晰地看出是什么颜色,我们将少部分颜色值进行转换。
换个说法就是将转换RGB到十六进制颜色代码。
# -*- coding: utf-8 -*-
# 截取6个RGB颜色值集合
RGB_colors = {(159, 46, 163), (136, 138, 228), (102, 26, 38), (194, 88, 201), (216, 48, 44), (50, 4, 88)}
hex_colors = []
for rgb_color in RGB_colors:
hex_color = '#{0:02x}{1:02x}{2:02x}'.format(*rgb_color)
hex_colors.append(hex_color)
# 打印十六进制颜色代码
print("打印十六进制颜色代码:", hex_colors)
(左右滑动查看完整代码)
打印十六进制颜色代码结果:
接下来我们用取色工具校验两个颜色,看一下效果:
颜色值:(159, 46, 163)
颜色代码:'#9f2ea3'
颜色值:(136, 138, 228)
颜色代码:'#888ae4'
OK,剩下的就不一一贴出来了,有兴趣的可自行试。
保存Excel
我们以上输出的颜色值和颜色代码为例,将结果输出保存到Excel中:
from openpyxl import Workbook
from openpyxl.styles import PatternFill
RGB_colors = [{'(159, 46, 163)': '#9f2ea3'}, {'(136, 138, 228)': '#888ae4'}, {'(102, 26, 38)': '#661a26'},
{'(194, 88, 201)': '#c258c9'}, {'(216, 48, 44)': '#d8302c'}, {'(50, 4, 88)': '#320458'}]
wb = Workbook()
ws = wb.active
ws.cell(row=1, column=1).value = "颜色值"
ws.cell(row=1, column=2).value = "颜色编号"
ws.cell(row=1, column=3).value = "颜色"
for index, rgb_color in enumerate(RGB_colors, start=2):
for key, value in rgb_color.items():
hex_color = 'FF' + value.replace('#', '')
ws.cell(row=index, column=1).value = key
fill = PatternFill(start_color=hex_color, end_color=hex_color, fill_type="solid")
ws.cell(row=index, column=2).value = hex_color
ws.cell(row=index, column=3).fill = fill
wb.save('图片颜色分析统计.xlsx')
(左右滑动查看完整代码)
注:其中有一个特殊的处理,就是在保存到Excel中时,openpyxl三方库颜色需要以 "FF" 开头的十六进制格式。其中在RGB颜色代码前面加上了 'FF',这表示颜色是完全不透明的。
Excel中效果:
总结
小栈的代码简单、清晰,将代码实例整体梳理了,有兴趣可下载。
如果需要更复杂、更细节的分析。有兴趣的同学可以进一步探索。
源码已整理:
有兴趣的朋友点个“赞”和“在看”,谢谢支持~!
后台回复“image_color”即可获取!
文章就分享到这儿,喜欢就点个赞吧!