Python转换图像以使用更少的颜色

时间:2018-01-12 09:17:52

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

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

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

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

我也没有发现太多关于此事的信息,包括实际信息或人们试图做同样的信息。

我想询问有关此类问题的任何信息或资源:   - 库(库)使用?   - 方法?(有没有广泛使用的算法来解决这类问题?)   - 我使用错误的编程语言吗?(有没有提供这种功能但更容易使用?)

非常感谢任何形式的帮助或信息,提前谢谢!

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

2 个答案:

答案 0 :(得分:2)

你所追求的是颜色量化。已经设计了几种算法,例如Median Cut或Popularity算法。它们允许您构建一个最佳的"具有所需条目数的颜色表。

这些方法在昂贵的显卡时代很流行,但由于真彩色的推广而失去了名气。

与颜色量化相辅相成,人们经常使用颜色抖动,这种方法可以恢复颜色渐变的某些平滑度,并避免出现条带效应。

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

答案 1 :(得分:2)

  

要使用的库(库)?

scikit-imageOpenCV是我的首选。

  

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

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

  

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

Python可以说是最简单的"这项任务的语言。

<强>样本

考虑这张图片:

original

以下代码将颜色数量从+ 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)

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

less_colors