【问题标题】:Programmatically obtaining the number of colors used in an image以编程方式获取图像中使用的颜色数量
【发布时间】:2010-12-09 20:49:04
【问题描述】:

问题:

  • 给定一张 PNG 格式的图像,以编程方式获取图像中使用的颜色数量的最简单方法是什么?

约束:

  • 该解决方案将集成到在 Linux 下运行的 shell 脚本中,因此任何适合这种环境的解决方案都可以。
  • 请注意,“图像文件的颜色容量”不一定与“使用的颜色”相对应。示例:在理论颜色容量为 256 色的图像文件中,仅说实际使用中可能有 7 种颜色。我想获取实际使用的颜色数量。

【问题讨论】:

    标签: language-agnostic image image-processing image-manipulation colors


    【解决方案1】:

    Alnitak 的解决方案很好 :) 我真的应该更好地了解 netpbm 和 imagemagick 等。

    仅供参考,作为一个简单且非常通用的解决方案:循环遍历图像中的每个像素,将 r,g,b 颜色值作为单个整数。在列表中查找该整数。如果它不存在,请添加它。完成所有像素后,打印列表中的颜色数。

    如果您想计算出现次数,请使用哈希映射/字典而不是简单列表,如果已经在字典中找到键的值(计数器),则增加该键的值(计数器)。如果未找到,则将其添加到起始计数器值 1。

    【讨论】:

    • “循环遍历图像中的每个像素 [...]”这不只是对问题的更详细的重新陈述吗?
    • 可以说,任何程序都是对问题的更详细的重述:) 问题是提问者是否知道这一点,以及告诉他是否有帮助。我根据问题的编写方式打了一个电话,并确定他可能不知道。
    【解决方案2】:

    为什么要编写自己的程序?

    如果您使用 shell 脚本执行此操作,则可以使用 netpbm 实用程序:

    count = `pngtoppm png_file | ppmhist -noheader | wc -l`
    

    【讨论】:

      【解决方案3】:

      Python Imaging Library 中的Image.getcolors 方法似乎完全符合您的要求。

      【讨论】:

        【解决方案4】:

        有趣。似乎没有任何保证的方法可以做到这一点。在最坏的情况下,您需要扫描图像并解释每个像素,在最好的情况下,PNG 将使用调色板,您可以在那里检查。

        即使在调色板的情况下,您也不能保证每个条目都被使用 - 所以您(充其量)获得了一个上限。

        http://www.libpng.org/pub/png/spec/1.1/PNG-Contents.html

        .. 以及这里的块信息:

        http://www.libpng.org/pub/png/spec/1.1/PNG-Chunks.html

        【讨论】:

        • 他特别想要实际使用的颜色数量,因此基于颜色深度或调色板的上限不够好
        • 嘿,很好。我答对了,然后对我的答案进行了扩展,以提供一个可能有用的粗略补充,您是否因此而给我打分?提醒我不要在我的陈述中添加颜色或上下文。我应该在分号后停止。
        • 其实你应该在“解释每个像素”之后停止
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 2015-04-07
        • 2011-01-16
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多