读取图片颜色占比绘制{精美}折线图失败

问题之初

读取图片颜色占比绘制{精美}折线图失败❌


花了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()

希望能够满足你的需求!如果还有其它问题,请随时提问。

错误❌

反手就给我一个错误❌,让我欲仙欲死!
读取图片颜色占比绘制{精美}折线图失败_第1张图片
读取图片颜色占比绘制{精美}折线图失败_第2张图片
这个问题是因为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|:/ $


完整修改代码
给我。
不要省略任何代码
进度条用方块
代码考虑各种因素

最近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()

该代码包含了以下修改:

  • 进度条使用方块来表示填充部分,对应进度条长度的50个方块。
  • 添加了对文件路径的有效性检查,若路径无效则会提示并退出程序。
  • 添加了对中文字体和英文字体的选择,通过font_dir变量指定字体文件夹路径。
  • 保存颜色占比信息到文件,并将文件路径输出。
  • 添加了散点图的设置和保存功能,其中包括添加颜色类型标签和设置坐标轴名称等内容,保存的图片名称为原图片名称加上后缀_Color_Analysis.png

请注意,根据实际情况,你可能需要根据字体文件的存放位置修改font_dir变量的值,以确保能正确加载字体文件。

读取图片颜色占比绘制{精美}折线图失败_第3张图片
读取图片颜色占比绘制{精美}折线图失败_第4张图片

你可能感兴趣的:(python,青少年编程,自动化,图像处理,智能手机)