互联网的人们!我正在编写一个程序,它需要尝试使用Jimp找到大量像素的最接近的RGB匹配。
假设你有一种略带紫色的颜色,我想把它改为我的表格中的紫色,如下所示:
var colors = [
[0,0,255,0],
[1,255,165,0],
[2,0,0,255],
[3,255,192,203],
[4,165,42,42],
[5,255,255,255],
[6,0,0,0],
[7,230,230,350],
[8,255,255,0],
[9,0,0,0],
](可以忽略其中一个数组中的第一个数字,其余的只有R、G和B)
所以如果我有一个像(255,7,1)这样的红色,我想把它和我表中的红色匹配起来,就是(255,0,0)
我已经尝试了一些东西,但它非常愚蠢并且不起作用,所以我将省去你的细节。
有人能帮我吗?谢谢!
发布于 2021-11-08 08:22:48
RGB是一个三维空间。将一种颜色视为3d空间中的一个点,您应该使用3d毕达哥拉斯找到两个点之间的最近距离。
const colors = [
[0,0,255,0],
[1,255,165,0],
[2,0,0,255],
[3,255,192,203],
[4,165,42,42],
[5,255,255,255],
[6,0,0,0],
[7,230,230,350],
[8,255,255,0],
[9,0,0,0],
]
function get_closest_color(colors, [r2, g2, b2]) {
const [[closest_color_id]] = (
colors
.map(([id, r1,g1,b1]) => (
[id, Math.sqrt((r2-r1)**2 + (g2-g1)**2 + (b2-b1)**2)]
))
.sort(([, d1], [, d2]) => d1 - d2)
);
return colors.find(([id]) => id == closest_color_id);
}
const closest_color = get_closest_color(colors, [230, 200,0]);
console.log(closest_color);
发布于 2021-11-08 07:31:42
如果我没理解错你的问题,你可以这样做
const colors = [
[0,0,255,0],
[1,255,165,0],
[2,0,0,255],
[3,255,192,203],
[4,165,42,42],
[5,255,255,255],
[6,0,0,0],
[7,230,230,350],
[8,255,255,0],
[9,0,0,0],
]
const findClosestColor = (color, colors) =>
colors.reduce((res, c) => {
const distance = [1,2,3].reduce((sum, i) => sum + Math.abs(c[i] - color[i]), 0)
if(distance > res.distance){
return res;
}
return {
closest: c,
distance
}
}, {closest: null, distance: 9999} ).closest
console.log(findClosestColor([0, 255,7,1], [[1,0,0,200], [2,255,0,0], [3, 128,128,128]]))
发布于 2021-11-08 07:31:33
使用此处的函数查找E距离最小的颜色
https://stackoverflow.com/questions/69879777
复制相似问题