【问题标题】:Python converting an image to use less colorsPython将图像转换为使用较少的颜色
【发布时间】:2018-06-21 17:19:51
【问题描述】:

我想拍摄一张图像并(以某种方式)将其读取为像素数组。这意味着 2d 数组的每个元素将是表示该像素颜色的十六进制代码或 RGB 3 元组。

我研究了图像处理并找到了 Pillow 或 SciPy 之类的东西,但我只发现了过于简单的东西,例如添加过滤器或更改图像的一般颜色属性(通过将 read 和 blue 值相乘使其通常更绿)每个像素乘以 0.3 - 0.5,同时将绿色值乘以 1,有效地保持相同)。我需要做的是能够根据颜色单独检查每个像素。

之后,我需要将图像转换为使用较少颜色的图像(例如 4 或 8)。我认为最好的方法是为这些所需的颜色定义一些“阈值”,当像素的颜色在定义的某个颜色范围内时,像素就会获得相应的颜色。

我也没有发现太多关于这方面的信息,无论是实际信息还是人们试图这样做。

我想询问有关此类问题的任何信息或资源: - 图书馆(图书馆)使用? - 方法?(有没有针对这类问题广泛使用的算法?) - 我是否使用了错误的编程语言?(有没有提供这种功能但更易于使用的语言?)

任何形式的帮助或信息将不胜感激,在此先感谢您!

编辑:我发现this 问题是指获取像素的值,但我仍然需要将它们分成更少的颜色。

【问题讨论】:

  • 根据我的经验,在使用颜色处理进行此类工作时,要获得好的结果可能非常棘手。我发现this 对这个主题很有用,我希望它能给你一些想法,作为你可以采取的方法
  • KMeans 聚类是一个可能的选择。
  • @TCouch 谢谢,这实际上对此事有所启发!步骤顺序实际上几乎正是我想要的。
  • scikit-learn 有一个教程/演示:link
  • @MaxPowers 我也想到了,实际上我最近做了一个相当详细的实现,但是 KMeans 需要在 2 个数据点之间定义明确的距离函数,正如 TCouch 给出的文章所述,在处理颜色时并不完全......可行。

标签: python python-3.x image-processing colors


【解决方案1】:

你所追求的是颜色量化。已经设计了几种算法,例如中值切割或流行度算法。它们允许您构建具有所需条目数的“最佳”颜色表。

这些方法在显卡昂贵的时代很流行,但在真彩色普及后就失去了名气。

作为颜色量化的补充,人们经常使用颜色抖动,这种方法可以恢复颜色渐变的一些平滑度并避免条带效应。

https://nl.mathworks.com/help/images/reduce-the-number-of-colors-in-an-image.html?requestedDomain=true

【讨论】:

    【解决方案2】:

    要使用的库(libraries)?

    scikit-imageOpenCV 将是我的首选。

    方法? (有没有针对这类问题广泛使用的算法?)

    K-means clustering 是一种流行的颜色量化方法。

    我是否使用了错误的编程语言? (有没有提供这种功能但更易于使用的?)

    Python 可以说是完成这项任务的“最简单”的语言。

    演示

    考虑这张图片:

    以下代码将颜色数量从 +500K 减少到仅 6 种:

    import numpy as np
    from skimage import io
    from sklearn.cluster import KMeans
    
    original = io.imread('https://i.stack.imgur.com/QCl8D.jpg')
    n_colors = 6
    
    arr = original.reshape((-1, 3))
    kmeans = KMeans(n_clusters=n_colors, random_state=42).fit(arr)
    labels = kmeans.labels_
    centers = kmeans.cluster_centers_
    less_colors = centers[labels].reshape(original.shape).astype('uint8')
    
    io.imshow(less_colors)
    

    这就是颜色量化图像的外观:

    【讨论】:

    • 在看到这个答案之前,我已经并行计算了 k-means 方法,但这正是我所希望的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2021-03-01
    • 2016-07-10
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多