1

画像の選択的な色の変更について 1 週間以上読んでいます。カラーピッカーから色を選択してから、色を変更したい画像の部分を選択し、元の色からカラーピッカーの色に色の変更を適用することを意味しました。

たとえば、カラー ピッカーで青色を選択し、画像で赤色の部分も選択した場合、すべての画像で赤色を青色に変更できるはずです。

もう一つの例。赤いリンゴとオレンジの画像があり、画像でリンゴを選択し、カラー ピケットで青を選択すると、すべてのリンゴの色が赤から青に変わるはずです。

私にはいくつかのアイデアがありますが、もちろん、これを行う方法についてもっと具体的なものが必要です

読んでくれてありがとう

4

2 に答える 2

1

開始点として、画像の色をクラスタリングすることを検討してください。必要なクラスターの数がわからない場合は、特定の 2 つのクラスターをマージするかどうかを決定するメソッドが必要になります。とりあえず、その数を知っているとしましょう。たとえば、左の次の画像では、その色を 3 つのクラスターにマッピングしました。これらのクラスターの平均色は中央に示されています。各クラスターをその平均色で表すと、右の図が得られます。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

出力が右にあるので、必要なのは色を置き換える方法です。ユーザーが画像のどこか (1 点) をクリックすると、変更が必要な元の画像の位置がわかります。次の画像では、ユーザー (私) が「オレンジ色」のクラスターに含まれる点をクリックしました。それから彼はいくつかの青い色合いをクリックしました。そこから、「オレンジ色」のクラスター内のポイントを表すマスクを作成し、それを操作します。私は単純なガウス フィルターとそれに続く 3x5 のフラットな膨張を考えました。次に、生成されたマスクに従って元の画像の色相を置き換えます (ローパス フィルタリングの後、その値は画像を合成するためのアルファ値とも見なされます)。

ここに画像の説明を入力

まったく完璧ではありませんが、私よりも優れたクラスタリングと、原始的ではない色置換方法を使用できます。入力の前処理なしで RGB の基本的な k-means のみを使用したため、クラスタリング方法、色空間などに関する詳細は意図的にスキップしました。したがって、上記の結果は、他にできることのベースラインと考えることができます。

于 2013-01-13T19:00:05.477 に答える
0

画像、選択した色、ターゲットの新しい色が与えられた場合、見苦しくなければ多くのことを行うことはできません。あるピクセルの色は「十分に近い」一方で、別のピクセルの色は明らかに「異なる」と言うことができるように、範囲、色のある程度の変化も必要です。

処理の最初のステップ: グレースケールで 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 であり、オーバーフローと符号付き/符号なしの問題に注意してください。

于 2012-11-11T02:52:37.223 に答える