惊艳了,Python可以分析一张图片中包含有几种颜色?(附源码)

文摘   科技   2024-06-09 20:34   北京  

ISEE小语


古语有云:“人闲是非多,百忙解千愁。”


在Python中要分析一张图片中有几种颜色,并呈现到Excel表格中统计出来。

接下来我们看一下具体的实现。



环境:

Pycharm

Python 3.9.16



安装:

本次我们用到了两个三方包协助,一个是“openpyxl”,另一个是“pillow”。

用以下方式可自行安装:

pip install pillow==10.3.0pip install openpyxl==3.1.3




先看实际效果


准备一张图片

首先,准备一张所要分析的图片,以下是实例中所用到的:


实现原理

主要实现步骤:

  • 读取图片:确保图片是在RGB模式下计数每种颜色的像素数

  • 转换颜色编码:将RGB颜色转换为颜色编号。

  • 保存Excel:将颜色编码及呈现的颜色,一一对应保存到Excel中。


读取图片

首先,将准备的图片命名为image.png,放在当前文件夹下

然后,加载图片、读取所有像素、去重相同颜色,这个时候会打印出图片中所有的颜色和它们各自的计数,包括非常微小的变化,因为它是基于像素级的颜色读取。

from PIL import Imagefrom 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 Workbookfrom openpyxl.styles import PatternFill
# 输出的RGB颜色集合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'}]

# 创建一个新的Excel工作簿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 # 在Excel中设置单元格颜色,确保使用aRGB格式 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
# 保存Excel文件wb.save('图片颜色分析统计.xlsx')

(左右滑动查看完整代码)

注:其中有一个特殊的处理,就是在保存到Excel中时,openpyxl三方库颜色需要以 "FF" 开头的十六进制格式。其中在RGB颜色代码前面加上了 'FF',这表示颜色是完全不透明的。

Excel中效果:


总结

栈的代码简单、清晰,将代码实例整体梳理了,有兴趣可下载。

如果需要更复杂、更细节的分析兴趣的同学可以进一步探索。

源码已整理:



有兴趣的朋友点个“”和“在看”,谢谢支持~!

后台回复“image_color”即可获取!

     

文章就分享到这儿,喜欢就点个吧!



推荐阅读  点击标题可跳转


ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章