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

Rar*_*ima 2 python colors image-processing python-3.x

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

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

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

我也没有发现太多关于这一点的信息,无论是在实际信息的方式还是试图做同样事情的人。

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

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

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

Ton*_*has 6

库(libraries)使用?

scikit-imageOpenCV将是我的首选。

方法?(是否有针对此类问题的广泛使用的算法?)

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

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

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)
Run Code Online (Sandbox Code Playgroud)

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

少颜色