如何使用OpenCV减少图像中的颜色数量?

32

我有一组图像文件,我希望将它们的颜色数量减少到64个。我该如何使用OpenCV实现这个目标?
我需要这么做是为了能够处理一个大小为64的图像直方图。我正在实现CBIR技术。
我的需求是将颜色量化到一个4位调色板中。

如果您想要64种颜色,则需要一个6位调色板。请参阅我的回答,以获得更好的解释和代码,以使用每个颜色通道的2位来构建6位调色板图像。 - Moacir Ponti
@Felipe 添加了一个新答案,你可能会觉得它很有趣。 - karlphillip
12个回答

1
nQuantGpp 包含了用于 g++ 的前十种颜色量化算法,可以生成高质量的优化图像。它是从 nQuantCpp 移植而来的,后者迁移到 OpenCV,以利用这个流行库的深度学习功能。
Mat source = imread(sourceFile, IMREAD_UNCHANGED);
PnnQuant::PnnQuantizer pnnQuantizer;
int nMaxColors = 64;
vector<uchar> pngBytes;
Mat dest = pnnQuantizer.QuantizeImage(source, pngBytes, nMaxColors, true);
if(nMaxColors > 256)
    imwrite(destPath, dest);
else {
    ofstream outfile(destPath, ios::binary);
    outfile.write(reinterpret_cast<const char*>(pngBytes.data()), pngBytes.size());
    outfile.close();
}

通过快速PNN算法将颜色减少到64种 通过快速配对最近邻算法将颜色减少到64种 通过带有CIELAB颜色空间的快速PNN算法将颜色减少到64种 通过带有CIELAB颜色空间的快速配对最近邻算法将颜色减少到64种 通过NeuQuant神经网络量化算法将颜色减少到64种 通过NeuQuant神经网络量化算法将颜色减少到64种 通过高效、边缘感知、综合颜色量化和抖动技术,使用CIELAB颜色空间将图像压缩为64种颜色。 通过高效、边缘感知、综合颜色量化和抖动技术,使用CIELAB颜色空间将图像压缩为64种颜色 通过Xialoin Wu的快速最优颜色量化算法,将图像压缩为64种颜色。 通过Xialoin Wu的快速最优颜色量化算法,将图像压缩为64种颜色 最后,对于CBIR技术来说,最重要的方法应该是OTSU方法(OTSU),它是一种全局自适应二值化阈值图像分割算法。然后,通过从图像数据集中高效提取特征向量的方式将图像分类为有意义的类别,这一过程依赖于特征选择技术。

请明确说明这是您自己编写的图书馆,并包含一些代码来展示如何使用该图书馆来获得这些结果。否则,这就是广告,而不是答案。 - Cris Luengo
请明确表明这是你自己编写的库,并包含一些代码来展示如何使用该库来获得这些结果。否则这就是一则广告,而不是一个答案。 - undefined
每个算法在nQuantGpp中都带有我的名字,版权所有(c)2023年Miller Cy Chan。 - Miller Cy Chan
每个算法在nQuantGpp中都以我的名字作为版权所有者 (c) 2023 Miller Cy Chan - undefined

-2

为什么不直接进行矩阵乘法/除法?值将自动四舍五入。

伪代码:

将通道转换为无符号字符(CV_8UC3),
除以总颜色数/所需颜色数。Mat = Mat / (256/64)。小数点将被截断。
乘以相同的数字。Mat = mat * 4

完成。每个通道现在只包含64种颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接