颜色量化稀释纯白色
Color quantization diluting pure whites
我有一个简单的量化函数
public static int quantize(int oldpixel) {
int r = (oldpixel >> 16) & 0xff;
int g = (oldpixel >> 8) & 0xff;
int b = (oldpixel >> 0) & 0xff;
int color = 0xff << 24 | (((int) ((r) / 32) * 32) & 0xff) << 16 |
(((int) ((g) / 32) * 32) & 0xff) << 8 |
(((int) ((b) / 32) * 32)& 0xff) << 0;
return color;
}
它所做的是将颜色减少到较低的细节颜色,然后扩展它,这人为地限制了调色板,我将它用于抖动过滤器,通过该函数的图像产生这个
在:
Unquantized hue wheel
出去:
Quantized hue wheel
这几乎是完美的结果,除了白色被减少为灰色,我知道原因是我在算法中分割了颜色,但我不知道如何解决这个问题,有什么建议吗赞赏
将每个分量除以 32 后,得到一个介于 0 和 7 之间的整数。您试图将其映射回 0 到 255 的范围,因此 0 是 0,7 是 255。
你可以将它乘以 255/7,正好是 36.428。
您可以使用 (int)((r / 32) * (255.0 / 7.0))
之类的东西,但 Java 中的演员表很难看。要改进它,您可以将它包装在一个函数中,并具有 quantizeChannel(r)
、quantizeChannel(g)
和 quantizeChannel(b)
。或者您可以交换顺序并使用整数运算:r / 32 * 255 / 7
.
我有一个简单的量化函数
public static int quantize(int oldpixel) {
int r = (oldpixel >> 16) & 0xff;
int g = (oldpixel >> 8) & 0xff;
int b = (oldpixel >> 0) & 0xff;
int color = 0xff << 24 | (((int) ((r) / 32) * 32) & 0xff) << 16 |
(((int) ((g) / 32) * 32) & 0xff) << 8 |
(((int) ((b) / 32) * 32)& 0xff) << 0;
return color;
}
它所做的是将颜色减少到较低的细节颜色,然后扩展它,这人为地限制了调色板,我将它用于抖动过滤器,通过该函数的图像产生这个
在: Unquantized hue wheel 出去: Quantized hue wheel
这几乎是完美的结果,除了白色被减少为灰色,我知道原因是我在算法中分割了颜色,但我不知道如何解决这个问题,有什么建议吗赞赏
将每个分量除以 32 后,得到一个介于 0 和 7 之间的整数。您试图将其映射回 0 到 255 的范围,因此 0 是 0,7 是 255。
你可以将它乘以 255/7,正好是 36.428。
您可以使用 (int)((r / 32) * (255.0 / 7.0))
之类的东西,但 Java 中的演员表很难看。要改进它,您可以将它包装在一个函数中,并具有 quantizeChannel(r)
、quantizeChannel(g)
和 quantizeChannel(b)
。或者您可以交换顺序并使用整数运算:r / 32 * 255 / 7
.