首页 > 解决方案 > 颜色偏移图像以匹配调色板

问题描述

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

如果有人可以分享有关如何做到这一点的任何想法,那就太好了。

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

标签: javaimagealgorithmimage-processing

解决方案


当我在此输入图像上使用简单的 C++ 抖动时(从您的图像中裁剪):

在图片中

并使用不同的颜色作为调色板:

在朋友

我得到了这个输出:

抖动

顶部的方块是使用的调色板,对我来说看起来超过 20 种颜色……正如您所见,输出比您的要好得多,但您的抖动结果看起来太像素化了,是不是降采样然后放大了?

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

15 种颜色

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

27 种颜色

[Edit1] 算法

  1. 分别处理每一行图像

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

  2. 对于每个像素(处理线)

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

像这样的东西:

for (y=0;y<height;y++)
 {
 r0=0; g0=0; b0=0;
 for (x=0;x<width;x++)
  {
  // pick and add wanted color
  col=pixel(x,y);
  r0+=col.r;
  g0+=col.g;
  b0+=col.b;
  // chose closest color
  ix=0; col=(r0,g0,b0);
  for (i=0;i<palette_size;i++)
   if (color_distance(col,pal[i])<color_distance(col,pal[ix]))
    ix=i;
  col=pal[ix];
  // render and substract chosed color
  pixel(x,y)=col;
  r0-=col.r;
  g0-=col.g;
  b0-=col.b;
  }
 }

LUT[r][g][b]通过表格可以显着加快选择最接近的颜色。

这种方法既快速又简单,但远非最佳视觉效果。


推荐阅读