读取图片颜色占比绘制{精美}折线图失败❌
花了4个小时 你问我问题吧 选择题
读取一张图片各种颜色占比
默认
/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: # 如果颜色不在统计字典中,则加入字典并初始化计数为1
color_counts[color] = 1
else: # 否则计数加1
color_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%的颜色")
文件名命名方法:编号. 库 样式 时间戳
保存 /storage/emulated/0/文件/代码print相关/结构图/
没有就新建
中文字体 /storage/emulated/0/文件/字体大全/字体包/宋体.ttf
其它中文字体 /storage/emulated/0/文件/字体大全/字体包/
英语字体 /storage/emulated/0/文件/字体大全/
这个目录下检索可用英语.ttf,如果需要英语的话
那么多字体,不支持就更换
文件名没有库或者样式就省略掉
优雅热情沉默的注释每行每行
with plt.style.context(matplotx.styles.dracula):
# 散点图
plt.scatter(x, y, c=y2)
# 颜色类型
plt.colorbar(label='Y2')
# 坐标轴名称
plt.xlabel('X')
plt.ylabel('Y')
# 显示 plt.show()
完整代码
自动设置检测代码需要的库 函数 变量 定义 样式等
文件名命名方法:编号. 库 样式 时间戳
保存 /storage/emulated/0/文件/代码print相关/结构图/
没有就新建
中文字体 /storage/emulated/0/文件/字体大全/字体包/宋体.ttf
其它中文字体 /storage/emulated/0/文件/字体大全/字体包/
英语字体 /storage/emulated/0/文件/字体大全/
这个目录下检索可用英语.ttf,如果需要英语的话
那么多字体,不支持就更换
文件名没有库或者样式就省略掉
优雅热情沉默的注释每行每行
input设置图片路径 默认 /storage/emulated/0/Pictures/Screenshots/Screenshot_2023_1005_204401.png
文件名命名方法:编号. 库 样式 时间戳
保存 /storage/emulated/0/文件/代码print相关/结构图/
没有就新建
中文字体 /storage/emulated/0/文件/字体大全/字体包/宋体.ttf
其它中文字体 /storage/emulated/0/文件/字体大全/字体包/
英语字体 /storage/emulated/0/文件/字体大全/
这个目录下检索可用英语.ttf,如果需要英语的话
那么多字体,不支持就更换
文件名没有库或者样式就省略掉
优雅热情沉默的注释每行每行
input设置图片路径 默认 /storage/emulated/0/Pictures/Screenshots/Screenshot_2023_1005_204401.png
完整代码
自动设置检测代码需要的库 函数 变量 定义 样式等
with plt.style.context(matplotx.styles.dracula):
# 散点图
plt.scatter(x, y, c=y2)
# 颜色类型
plt.colorbar(label='Y2')
# 坐标轴名称
plt.xlabel('X')
plt.ylabel('Y')
# 显示 plt.show()
图片保存在什么位置
增加打印位置和进度条
增加打印图片保存位置
增加 f.write(f"\t\t{str(color)}: {ratio:.2%},\n")设置
增加input读取图片提示
根据代码示例,图片保存的位置为`/storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg`。如果你想要更改图片保存位置,可以修改`image_path`变量的数值为你想要保存图片的路径。
另外,在代码中没有提到具体的图片保存操作,需要在适当的位置添加保存代码。可以使用PIL库的`image.save()`方法将图片保存到指定路径。例如,可以在`# 输出结果`后面添加以下代码实现图片保存:
```python
image.save("/storage/emulated/0/Pictures/Screenshots/Saved_Image.jpg")
这样,图片将会保存在/storage/emulated/0/Pictures/Screenshots/
目录下,并命名为Saved_Image.jpg
。你可以根据自己的需求调整保存路径和文件名。
关于打印位置和进度条的需求,可以在适当的位置添加打印语句和进度条代码,以实现你的需求。同时,你可以使用格式化字符串(f-string)来输出颜色及其占比的信息到文件,例如在# 对结果字典按照颜色占比从大到小排序,并输出颜色及其占比
的代码块中添加以下代码:
with open("占比信息.txt", "w") as f:
for color, ratio in sorted(color_ratios.items(), key=lambda x: x[1], reverse=True):
f.write(f"\t\t{str(color)}: {ratio:.2%},\n")
这样会将颜色及其占比信息保存到名为"占比信息.txt"的文件中。同样,你可以根据需要修改保存路径和文件名。
最后,关于输入读取图片路径的提示,你可以使用input()
函数来获取用户输入的图片路径,并将其赋值给image_path
变量。例如,在代码开头添加以下代码:
image_path = input("请输入图片路径:")
这样运行代码时,程序会要求用户输入图片的路径,并将用户输入的路径作为图片路径进行处理。
以下是根据你提供的要求,完整添加了保存图片、打印信息、进度条等功能后的代码:
import os
import time
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.style as matplotx
# 文件保存路径
folder_path = "/storage/emulated/0/文件/代码print相关/结构图/"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# 字体路径
font_dir = "/storage/emulated/0/文件/字体大全/"
# 获取可用的中文字体路径
chinese_font = ""
if os.path.exists(font_dir + "字体包/宋体.ttf"):
chinese_font = font_dir + "字体包/宋体.ttf"
else:
for font_file in os.listdir(font_dir + "字体包/"):
if font_file.endswith(".ttf"):
chinese_font = font_dir + "字体包/" + font_file
break
# 获取可用的英文字体路径
english_font = ""
for font_file in os.listdir(font_dir):
if font_file.endswith(".ttf"):
english_font = font_dir + font_file
break
# 获取图片路径
image_path = input("请输入图片路径:")
if not os.path.isfile(image_path):
print("输入的图片路径无效!")
exit()
# 打开并加载图片
image = Image.open(image_path)
pixels = image.load()
# 初始化颜色统计字典,用于存储颜色及其在图片中出现的次数
color_counts = {}
# 遍历所有像素,并统计颜色出现次数
total_pixels = image.size[0] * image.size[1] # 计算总像素数
bar_length = 50 # 进度条长度
print("正在处理,请稍候...")
for i in range(image.size[0]):
for j in range(image.size[1]):
color = pixels[i, j]
if isinstance(color, int):
color = (color, color, color)
if color not in color_counts:
color_counts[color] = 1
else:
color_counts[color] += 1
if i == 0 or (i + 1) % max(1, image.size[0] // bar_length) == 0 or i == image.size[0] - 1:
progress = (i + 1) / image.size[0]
print("[" + "#" * int(progress * bar_length) + " " * (bar_length - int(progress * bar_length)) +
"] {:.2%}".format(progress), end="\r")
# 计算每种颜色在图片中的比例
threshold = 0.001 # 占比阈值,控制输出结果中的颜色种类
color_ratios = {}
for color, count in color_counts.items():
color_ratio = count / total_pixels
if color_ratio >= threshold:
color_ratios[color] = color_ratio
# 输出结果,并保存颜色占比信息到文件
print("\n颜色占比信息:")
info_file = folder_path + "颜色占比信息.txt"
with open(info_file, "w") as f:
for color, ratio in sorted(color_ratios.items(), key=lambda x: x[1], reverse=True):
print(f"\t\t{str(color)}: {ratio:.2%}")
f.write(f"{str(color)}: {ratio:.2%}\n")
print(f"颜色占比信息已保存至 {info_file}")
# 散点图设置、保存
x = [1, 2, 3, 4, 5]
y = [4, 3, 5, 1, 2]
y2 = [0.1, 0.3, 0.5, 0.8, 0.4]
with plt.style.context(matplotx.styles.dracula):
fig, ax = plt.subplots()
# 散点图
ax.scatter(x, y, c=y2)
# 颜色类型
ax.colorbar(label='Y2')
# 坐标轴名称
ax.set_xlabel('X', fontproperties=plt.FontProperties(fname=english_font))
ax.set_ylabel('Y', fontproperties=plt.FontProperties(fname=chinese_font))
# 显示和保存图片
image_name = ""
if os.path.basename(image_path).startswith("Screenshot"):
image_name = "Color_Analysis_" + time.strftime("%Y%m%d_%H%M%S") + ".png"
else:
image_name = os.path.splitext(os.path.basename(image_path))[0] + "_Color_Analysis.png"
image_file = folder_path + image_name
plt.savefig(image_file)
print(f"颜色分析图已保存至 {image_file}")
plt.show()
希望能够满足你的需求!如果还有其它问题,请随时提问。
反手就给我一个错误❌,让我欲仙欲死!
这个问题是因为matplotx.style
模块没有styles
属性导致的。正确的写法应该是matplotlib.style.context()
。请修改以下代码段:
with plt.style.context(matplotx.styles.dracula):
修改为:
with plt.style.context("dark_background"):
这样可以使用"dark_background"
风格。同时,请确保你已经安装了matplotlib
库,并且版本较新。
/data/user/0/org.qpython.qpy/files/bin/qpy thon3.sh "/storage/emulated/0/qpython/图计 算.3.3.2.py" && exit
python/图计算.3.3.2.py" && exit < 请输入图片路径:/storage/emulated/0/Pictur es/Screenshots/Screenshot_2023_1005_204401 .png
正在处理,请稍候...
[ [ [# [## [### [#### [##### [###### [####### [######## [######### [########## [########### [############ [############# [############## [############### [################ [################# [################## [################### [#################### [##################### [###################### [####################### [######################## [######################### [########################## [########################### [############################ [############################# [############################## [############################### [################################ [################################# [################################## [################################### [################################### [#################################### [##################################### [###################################### [####################################### [######################################## [######################################### [######################################### [######################################### [######################################### [######################################### [######################################### [######################################### [######################################### [######################################### [######################################### #########] 100.00%
颜色占比信息:
(240, 247, 255): 0.43%
(250, 240, 231): 0.37%
(240, 244, 253): 0.34%
(241, 248, 255): 0.34%
(241, 245, 254): 0.34%
(249, 239, 230): 0.30%
(238, 220, 200): 0.29%
(241, 220, 201): 0.28%
(239, 243, 252): 0.26%
(223, 211, 199): 0.26%
(239, 246, 254): 0.25%
(224, 212, 200): 0.23%
(249, 248, 253): 0.22%
(237, 220, 202): 0.21%
(235, 220, 199): 0.21%
(248, 248, 248): 0.21%
(235, 216, 199): 0.18%
(234, 219, 198): 0.18%
(247, 247, 247): 0.18%
(246, 240, 228): 0.17%
(242, 246, 255): 0.17%
(233, 217, 201): 0.17%
(251, 241, 232): 0.15%
(249, 249, 249): 0.15%
(236, 217, 200): 0.14%
(248, 239, 230): 0.14%
(226, 212, 201): 0.14%
(238, 245, 253): 0.13%
(248, 248, 246): 0.13%
(248, 247, 252): 0.13%
(247, 246, 251): 0.13%
(240, 230, 220): 0.13%
(234, 215, 198): 0.13%
(249, 240, 231): 0.12%
(247, 248, 252): 0.12%
(233, 216, 200): 0.12%
(240, 224, 209): 0.12%
(244, 247, 255): 0.12%
(247, 238, 229): 0.12%
(249, 249, 247): 0.11%
(220, 206, 193): 0.11%
(238, 242, 251): 0.11%
(239, 223, 208): 0.11%
(246, 245, 250): 0.10%
(244, 247, 254): 0.10%
(237, 219, 199): 0.10%
颜色占比信息已保存至 /storage/emulated/0/文件/代码print相关/结构图/颜色占比信息.txt
Traceback (most recent call last):
File "/storage/emulated/0/qpython/图计算 .3.3.2.py", line 84, in
with plt.style.context(matplotx.styles .dracula):
^^^^^^^^^^^^^^^ AttributeError: module 'matplotlib.style' has no attribute 'styles'
1|:/ $
完整修改代码
给我。
不要省略任何代码
进度条用方块
代码考虑各种因素
下面是完整修改后的代码,请注意其中的注释:
import os
import time
from PIL import Image
import matplotlib.pyplot as plt
# 文件保存路径
folder_path = "/storage/emulated/0/文件/代码print相关/结构图/"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# 字体路径
font_dir = "/storage/emulated/0/文件/字体大全/"
# 获取可用的中文字体路径
chinese_font = ""
if os.path.exists(font_dir + "字体包/宋体.ttf"):
chinese_font = font_dir + "字体包/宋体.ttf"
else:
for font_file in os.listdir(font_dir + "字体包/"):
if font_file.endswith(".ttf"):
chinese_font = font_dir + "字体包/" + font_file
break
# 获取可用的英文字体路径
english_font = ""
for font_file in os.listdir(font_dir):
if font_file.endswith(".ttf"):
english_font = font_dir + font_file
break
# 获取图片路径
image_path = input("请输入图片路径:")
if not os.path.isfile(image_path):
print("输入的图片路径无效!")
exit()
# 打开并加载图片
image = Image.open(image_path)
pixels = image.load()
# 初始化颜色统计字典,用于存储颜色及其在图片中出现的次数
color_counts = {}
# 遍历所有像素,并统计颜色出现次数
total_pixels = image.size[0] * image.size[1] # 计算总像素数
bar_length = 50 # 进度条长度
print("正在处理,请稍候...")
for i in range(image.size[0]):
for j in range(image.size[1]):
color = pixels[i, j]
if isinstance(color, int):
color = (color, color, color)
if color not in color_counts:
color_counts[color] = 1
else:
color_counts[color] += 1
if i == 0 or (i + 1) % max(1, image.size[0] // bar_length) == 0 or i == image.size[0] - 1:
progress = (i + 1) / image.size[0]
filled_length = int(progress * bar_length)
empty_length = bar_length - filled_length
print("[" + "■" * filled_length + "□" * empty_length + "] {:.2%}".format(progress), end="\r")
# 计算每种颜色在图片中的比例
threshold = 0.001 # 占比阈值,控制输出结果中的颜色种类
color_ratios = {}
for color, count in color_counts.items():
color_ratio = count / total_pixels
if color_ratio >= threshold:
color_ratios[color] = color_ratio
# 输出结果,并保存颜色占比信息到文件
print("\n颜色占比信息:")
info_file = folder_path + "颜色占比信息.txt"
with open(info_file, "w") as f:
for color, ratio in sorted(color_ratios.items(), key=lambda x: x[1], reverse=True):
print(f"\t\t{str(color)}: {ratio:.2%}")
f.write(f"{str(color)}: {ratio:.2%}\n")
print(f"颜色占比信息已保存至 {info_file}")
# 散点图设置、保存
x = [1, 2, 3, 4, 5]
y = [4, 3, 5, 1, 2]
y2 = [0.1, 0.3, 0.5, 0.8, 0.4]
with plt.style.context("dark_background"):
fig, ax = plt.subplots()
# 散点图
ax.scatter(x, y, c=y2)
# 颜色类型
ax.colorbar(label='Y2')
# 坐标轴名称
ax.set_xlabel('X', fontproperties=plt.FontProperties(fname=english_font))
ax.set_ylabel('Y', fontproperties=plt.FontProperties(fname=chinese_font))
# 显示和保存图片
image_name = ""
if os.path.basename(image_path).startswith("Screenshot"):
image_name = "Color_Analysis_" + time.strftime("%Y%m%d_%H%M%S") + ".png"
else:
image_name = os.path.splitext(os.path.basename(image_path))[0] + "_Color_Analysis.png"
image_file = folder_path + image_name
plt.savefig(image_file)
print(f"颜色分析图已保存至 {image_file}")
plt.show()
该代码包含了以下修改:
font_dir
变量指定字体文件夹路径。_Color_Analysis.png
。请注意,根据实际情况,你可能需要根据字体文件的存放位置修改font_dir
变量的值,以确保能正确加载字体文件。