【问题标题】:How to write program in python that will check most used colors in image?如何用 python 编写程序来检查图像中最常用的颜色?
【发布时间】:2023-01-08 02:40:50
【问题描述】:

我想知道这张图片中最常用的颜色列表:

enter image description here

我尝试了这段代码,但它花费的时间太长了:

from PIL import Image

colors = []
class Color:
    def __init__(self, m, c):
        self.col = c
        self.many = m

im = Image.open("~/.../strowberry.jpeg")
def cool():
    for i in im.getdata():
        i = str(i)
        i = i.replace(", ", "")
        i = i.replace("(", "")
        i = i.replace(")", "")
        i = int(i)
        colors.append(Color(1, i))
    for x in colors:
        num = 0
        for j in range(len(colors)):
            if x.col == colors[num].col:
                del colors[num]
                num -= 1
                x.many += 1
            num += 1
    for obj in colors:
        print(obj.many, obj.col)
cool()

【问题讨论】:

    标签: python-3.x colors detect


    【解决方案1】:

    不要重新发明轮子。 Python 标准库包含一个 Counter 可以更有效地为您完成这项工作。使用它,您不需要自己迭代数据。您也不需要定义类并执行字符串操作。代码非常简短:

    import collections
    from PIL import Image
    
    im = Image.open('strawberry.jpg')
    counter = collections.Counter(im.getdata())
    for color in counter:
        print(f'{counter[color]} times color {color}')
    

    如果你真的需要 Color 对象(无论你想在你的程序中用它做什么),你可以使用这个单行代码从计数器对象轻松创建它:

    colors = [Color(counter[color], color) for color in counter]
    

    ...如果您真的需要它与原始代码中的字符串格式相同,请改用它:

    colors = [Color(counter[color], int(''.join(map(str, color)))) for color in counter]
    

    请注意,两个单线使用列表理解,这是非常 Pythonic 的,而且在许多情况下也非常快。 代码int(''.join(map(str, color))) 与内部循环中的 5 行代码的作用相同。这利用了原始数据是整数元组这一事实,可以使用map(str, ...)将其转换为字符串,然后使用''.join(...)将其连接在一起。

    所有这些在我的机器上总共花费了大约 0.5 秒,没有打印(无论如何都很慢)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2013-03-19
      相关资源
      最近更新 更多