【问题标题】:color shift image to match a palette颜色偏移图像以匹配调色板
【发布时间】:2023-03-18 15:30:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你如何量化“看起来还不错”?
  • 我的意思是我不希望图像的颜色被反转或类似的东西。
  • 我只是希望它看起来比使用 floyd steinberg 算法在颜色方面进行抖动更好。
  • 你如何量化“看起来更好”?
  • 例如,当我使用 floyd steinberg 进行抖动时,某些区域会被炸毁,这是不应该的。如果有一些我可以在 java 中使用的“自动颜色分级”算法会很酷

标签: java image algorithm image-processing


【解决方案1】:

当我在此输入图像上使用my simple C++ dithering 时(从您的图像中裁剪):

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

我得到了这个输出:

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

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

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

[Edit1]算法

  1. 分别处理每一行图像

    所以通过水平或垂直线处理您的图像。在处理任何行和调色板pal[] 保留您允许的颜色之前,您需要将r0,g0,b0 签名的临时变量设置为零。

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

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

类似这样的:

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] table 可以显着加快选择最接近的颜色。

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

【讨论】:

  • 如前所述,它必须放大,并且分辨率较低。但我的调色板只包含 20 种颜色。我对此 100% 确定
  • 您能否提供一些伪代码用于您的抖动,就像我习惯于 java 一样
  • @joKa 添加了编辑...什么是源分辨率和目标分辨率,因此我们不会在不同条件下进行比较(在较小的分辨率下抖动看起来更糟)。超过 20 种颜色是由于缩放,而您在缩放一些最有可能渗色的颜色时,或者您在沿途某处使用了有损压缩(如 JPG)
  • 是的,我把它缩小了,我发现自己使用 double 而不是 float 来解决我的问题,结果似乎好一点。我对此很满意。无论如何感谢您的帮助!
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 2019-11-17
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多