1

我有一个简单的量化函数

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;
}

它所做的是将颜色减少到较低细节的颜色,然后将其扩展,这人为地限制了托盘,我将它用于抖动过滤器,通过该功能的图像产生这个

In: 未量化的色调 Out: 量化的色调轮

结果这几乎是完美的,除了白色被减少为灰色,我理解原因是我在算法中划分颜色的地板,但我不知道如何解决这个问题,任何建议将不胜感激

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

0

将每个分量除以 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.

于 2016-03-04T08:36:11.113 回答