我有一组图像文件,我希望将它们的颜色数量减少到64个。我该如何使用OpenCV实现这个目标?
我需要这么做是为了能够处理一个大小为64的图像直方图。我正在实现CBIR技术。
我的需求是将颜色量化到一个4位调色板中。
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();
}
为什么不直接进行矩阵乘法/除法?值将自动四舍五入。
伪代码:
将通道转换为无符号字符(CV_8UC3),
除以总颜色数/所需颜色数。Mat = Mat / (256/64)。小数点将被截断。
乘以相同的数字。Mat = mat * 4
完成。每个通道现在只包含64种颜色。