您可能会考虑使用K均值,但是在这种情况下,它很可能会非常慢。更好的方法可能是自己“手动”执行此操作。假设您具有CV_8UC3
类型的图像,即每个像素由0到255( Vec3b
)的3个RGB值表示的图像。您可以将这256个值“映射”到仅4个特定值,这将产生4 x 4 x 4
= 64
可能的颜色。
我有一个数据集,在这里我需要确保暗=黑色,亮=白色,并减少两者之间所有颜色的数量。这是我所做的(C ++):
inline uchar reduceVal(const uchar val)
{
if (val < 64) return 0;
if (val < 128) return 64;
return 255;
}
void processColors(Mat& img)
{
uchar* pixelPtr = img.data;
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
const int pi = i*img.cols*3 + j*3;
pixelPtr[pi + 0] = reduceVal(pixelPtr[pi + 0]); // B
pixelPtr[pi + 1] = reduceVal(pixelPtr[pi + 1]); // G
pixelPtr[pi + 2] = reduceVal(pixelPtr[pi + 2]); // R
}
}
}
导致[0,64)
[64,128)
变为0
, [64,128)
-> 64
和[128,255)
-> 255
,产生27
种颜色:
在我看来,这比其他答案中提到的任何其他方法都简洁,清晰,快速。
您还可以考虑将这些值减小为某个数字的倍数之一,例如:
inline uchar reduceVal(const uchar val)
{
if (val < 192) return uchar(val / 64.0 + 0.5) * 64;
return 255;
}
这将产生一组5种可能的值: {0, 64, 128, 192, 255}
,即125种颜色。
0
我有一组图像文件,并且想要将它们的颜色数量减少到64种。如何使用OpenCV做到这一点?
我需要这个,以便可以处理64尺寸的图像直方图。我正在实施CBIR技术
我想要的是将色彩量化到4位调色板。