Skip to main content
 首页 » 编程设计

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

2025年05月04日15EasonJim

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

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

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

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

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

任何类型的帮助或信息将不胜感激,提前致谢!

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

请您参考如下方法:

Library (libraries) to use?

scikit-image或 OpenCV将是我的首选。

Methods? (Are there any widely used algorithms for this kind of problem?)

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

Am I using the wrong programming language? (Is there one that offers this kind of functionality but easier to use?)

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

演示

考虑这张图片:

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

import numpy as np 
from skimage import io 
from sklearn.cluster import KMeans 
 
original = io.imread('/image/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) 

这就是彩色量化图像的样子: