画像、選択した色、ターゲットの新しい色が与えられた場合、見苦しくなければ多くのことを行うことはできません。あるピクセルの色は「十分に近い」一方で、別のピクセルの色は明らかに「異なる」と言うことができるように、範囲、色のある程度の変化も必要です。
処理の最初のステップ: グレースケールで 0.0 から 1.0 (または 0 から 1.0 として扱う最大値) の範囲で、入力画像と同じサイズのマスク画像を作成します。入力ピクセルごとに、その色が選択した色に十分近いかどうかをテストします。「同じ」または「十分に近い」場合は、マスクに 1.0 を入れます。違う場合は0.0を入れてください。ある程度の境界線である場合は、中間の値を入力してください。これを行う方法は、画像の詳細によって異なります。
これは LAB 空間で最もうまく機能し、原点に対する A、B 座標の角度に従って同一性をテストします。
マスクを手に入れたら、脇に置きます。次に、画像全体を色変換します。これは、HSV 空間で行うのが最適です。V チャンネルには触れないでください。360 度を法とする (S がバイトとして格納されている場合は 256 を法とする) 定数を S に追加し、選択した定数を S に乗算して、選択した色に対応する HSV の座標がターゲット色の HSV 座標に移動されるようにします。変更されていない L を使用して、変換された S と H を RGB に変換します。
最後に、マスクを使用して、元の画像と色を変換した画像をブレンドします。これを各チャンネルに適用します - 赤、緑、青:
output = (1-mask)*original + mask*transformed
すべてバイト配列で実行している場合、0 は 0.0、255 は 1.0 であり、オーバーフローと符号付き/符号なしの問題に注意してください。