java - 颜色偏移图像以匹配调色板
问题描述
我想知道是否有人知道一种算法,它可以改变图像的饱和度、颜色、亮度等属性,使其与调色板匹配,但看起来仍然足够好。
如果有人可以分享有关如何做到这一点的任何想法,那就太好了。
我的目标是在抖动图像时通过这样做来获得更好的结果,因为我的调色板只包含 20 种颜色。
解决方案
当我在此输入图像上使用简单的 C++ 抖动时(从您的图像中裁剪):
并使用不同的颜色作为调色板:
我得到了这个输出:
顶部的方块是使用的调色板,对我来说看起来超过 20 种颜色……正如您所见,输出比您的要好得多,但您的抖动结果看起来太像素化了,是不是降采样然后放大了?
仅使用 2 种 R、G、B、C、M、Y 色调和 3 种灰度会导致 15 种颜色抖动:
RGB 的色调和组合越多,效果就越好……这里是 3 种色调 3^3=27 种颜色的所有组合:
[Edit1] 算法
分别处理每一行图像
所以用水平线或垂直线处理你的图像。在处理任何包含允许颜色的行和调色板之前,您需要将有
r0,g0,b0
符号的临时变量设置为零。pal[]
对于每个像素(处理线)
提取它
r,g,b
并将其添加到 中,然后在您的调色板中r0,g0,b0
找到最接近的颜色并从中减去。(r0,g0,b0)
pal[]
r,g,b
r0,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]
通过表格可以显着加快选择最接近的颜色。
这种方法既快速又简单,但远非最佳视觉效果。
推荐阅读
- azure - 将本地主机名添加到 azure cloud shell
- javascript - How to get spinner to disappear once url loads
- python - How to change Python version used by Bokeh?
- sql - SQL 查询连接无关表
- css - 是否可以订购复杂的 CSS 网格系统的项目?
- java - Run As JUnit - ClassNotFoundException - BuildCommand 修复导致类解析问题
- javascript - ag-grid getColumnState 从不返回组
- python - error uninstalling django-tables2
- javascript - 无法让 Firebase 数据显示在简单的 Vue 应用程序上
- powershell - 用于在 IIS 10 上设置日志记录的 PowerShell 命令