Java 颜色移动图像以匹配调色板

Java 颜色移动图像以匹配调色板,java,image,algorithm,image-processing,Java,Image,Algorithm,Image Processing,我想知道是否有人知道一种算法,它可以改变图像的饱和度、颜色、亮度等属性,使其与调色板匹配,但看起来仍然足够好 如果有人能分享一些关于如何做到这一点的想法,那就太好了 我的目标是在抖动图像时通过这样做获得更好的效果,因为我的调色板仅包含20种颜色。当我在输入图像上使用时(从您的图像中裁剪): 并使用不同的颜色作为调色板,如下所示: 我得到了这个输出: 上面的方块是调色板,我觉得有20多种颜色。。。正如您所看到的,输出比您的要好得多,但是抖动结果看起来太像素化了,是不是先进行了降采样,然后进行

我想知道是否有人知道一种算法,它可以改变图像的饱和度、颜色、亮度等属性,使其与调色板匹配,但看起来仍然足够好

如果有人能分享一些关于如何做到这一点的想法,那就太好了

我的目标是在抖动图像时通过这样做获得更好的效果,因为我的调色板仅包含20种颜色。

当我在输入图像上使用时(从您的图像中裁剪):

并使用不同的颜色作为调色板,如下所示:

我得到了这个输出:

上面的方块是调色板,我觉得有20多种颜色。。。正如您所看到的,输出比您的要好得多,但是抖动结果看起来太像素化了,是不是先进行了降采样,然后进行了缩放

仅使用两种色调的R、G、B、C、M、Y和3种灰度会导致15种颜色抖动:

RGB的阴影和组合越多,效果越好。。。这里所有3种色调的组合3^3=27种颜色:

[Edit1]算法

  • 分别处理每行图像

    所以,通过水平线或垂直线处理图像。在处理包含允许颜色的任何行和调色板之前,需要将
    r0、g0、b0
    带符号的临时变量设置为零

  • 对于每个像素(处理线的)

    提取其
    r,g,b
    并将其添加到
    r0,g0,b0
    ,然后在调色板
    pal[]
    中找到最接近
    (r0,g0,b0)
    的颜色,并从
    r0,g0,b0
    中减去所选的
    r,g,b

  • 大概是这样的:


    对于(y=0;y)你如何量化“仍然足够好”?我的意思是我不希望图像的颜色反转或类似的东西。我只希望它看起来比使用floyd steinberg算法在颜色方面抖动更好。你如何量化“看起来更好”?例如,当我使用floyd steinberg抖动时,某些区域被吹出,这是不应该的。如果有一些“自动颜色分级”就很酷了我可以在Java中使用的算法正如我所说的,它必须放大,而且分辨率很低。但是我的托盘只有20种颜色。我100%确定这一点。你能像我以前那样为你的抖动提供一些伪代码吗java@joKa添加了编辑…什么是源和目标分辨率,所以我们不会在不同条件下进行比较(抖动在较小的分辨率下看起来更糟)。超过20种颜色是由于在缩放某些颜色时缩放的结果,而这些颜色很可能会溢出,或者在某个过程中使用了有损压缩(如JPG)是的,我把它缩小了。我发现自己用double而不是float来解决我的问题,结果似乎好了一点。我很高兴。无论如何,谢谢你的帮助!