不特定多数の色の平均を求める方法を探しています。これを行う方法を探すのに多くの時間を費やしました。まず、色を CMYK に変換して平均化を試みましたが、期待した結果が得られませんでした。次に、いくつかの異なる場所で、色を CIE L*a*b* 空間に変換してから平均化することが、これを行うための推奨される方法であることがわかりました。そこで、RGB カラーを LAB 空間に変換する方法を調べ、これを実現するために必要なアルゴリズムを Javascript に変換しました。
これで LAB 空間に色ができたので、色の平均を見つけるのと同じくらい簡単だと思ったので、このトリックを実行するために次の関数を書きました。
color.mixRGB = function() {
var cols = Array.prototype.slice.call(arguments),
i = cols.length,
lab = {l: 0, a: 0, b: 0};
while(i--) {
if (typeof cols[i].r === "undefined" && typeof cols[i].g === "undefined" && typeof cols[i] === "undefined") {
console.log("Not enough parameters supplied for color " + i + ".");
return;
}
if(cols[i].r === 0 && cols[i].g === 0 && cols[i].b === 0) {
cols.splice(i, 1);
} else {
cols[i] = color.RGBtoLAB(cols[i]);
lab.l += cols[i].l;
lab.a += cols[i].a;
lab.b += cols[i].b;
}
}
lab.l /= cols.length;
lab.a /= cols.length;
lab.b /= cols.length;
return color.LABtoRGB(lab);
};
関数に RGB (255, 0, 0) と RGB(0, 0, 255) を入力すると、RGB(202, -59, 136) が得られます。この色は、Color Hexa が言うこれら 2 つの RGB の平均、つまり RGB (128, 0, 128)、つまり紫に近いものではありません。
すべてのコードを見直しましたが、これまでのところ、 Color HexaおよびEasyRGBに対してそれらをダブルおよびトリプルチェックすることにより、変換アルゴリズムのいずれにも問題がないことを確認できました。つまり、a) 色を平均化する方法に問題があるか、b) 誤解されており、CIE L*a*b* 空間で色を混ぜようとしてはいけません。
ここで何が欠けていますか?現在のアルゴリズムを使用して、RGB (255, 0, 0) と RGB (0, 0, 255) を平均しても、Color Hexa (または視覚的推定) と同じ結果が得られないのはなぜですか? (ここに私の問題のフィドルがあります)