2012-01-30 18 views
8

私は、ユーザーが画像の色の一部、たとえばティーカップを触れることで変更できるiOSアプリケーションを開発しています。色を塗りつぶすためにFloodfillアルゴリズムを使用しているため、ユーザーは色を変更するためにティーカップをタップする必要があります。それはうまくいきます。しかし、最終的な色は置換色とは少し異なって見えます。私はオブジェクトの(ティーカップ)の色を選択した色に変換するより良いロジックを見つけるためにいくつかの問題があります。その彩度は明るさ&です。イメージカラーリングロジック/アルゴリズムの改善

次のロジックを使用して結果の色を取得しています。私は色を(色相、彩度、値)と表現しています。

touchedColor = (tchd_h, tchd_s, tchd_v); // I am not using this now 

pixelColor = (old_h, old_s, old_v); 
replacementColor = (new_h, new_s, new_v); 
resultColor = (new_h, new_s, old_v); 
pixelColor = resultColor; 

カップ塗装前(赤色で丸で囲みました)。

enter image description here

選択replacementColor。

enter image description here

カップreplacementColor(赤い色で丸で囲んだ)を塗装後。

enter image description here

上記最終画像を参照してください。私はちょうどのみ色相&彩度、およびない pixelColorを変更していますと、適用されるカラーは、選択replacementColorに似ていません。イメージの明度は変更されません。

私は値を変更した場合色相&彩度このようなとともに、その後

resultColor = (new_h, new_s, new_v); 
pixelColor = resultColor; 

カップになっフラット色、ライトにこのような&色合い、

を逃します

enter image description here

上記のロジックを調整して、ピクセルの色を一致する置換色に変更する考えが必要です。 飽和度&値を導き出す式があります。

+0

あなたが間違っていると思われる例を表示することはありますか?基本的な前提に問題は見られません。 –

+0

@マークランソム、はい、私は画像で私の質問を更新しました。 – EmptyStack

答えて

3

例では、ピンクの色を「置き換える色」と呼び、茶色を「置換色」としましょう。宛先の各ピクセルについて、ソース内の対応するピクセルを見つける。 「色を置き換える」からどのように変化するかをご覧ください。今度は、 "Replacement Color"と同様の調整を行い、それを現在の出力ピクセルでの色として使用します。

例として、現在のソースピクセルが5 "v"単位で置き換える色よりも暗い場合は、出力ピクセルを5 "v"単位で暗くした置換色に設定します。

調整する色の範囲を制限して、他のオブジェクトの色を変えないようにする必要があります。

+0

お返事ありがとうございます。私はあなたが言っていることを理解することができます。私はそれをリアルタイムで実装する方法を知らない。あなたは私に擬似コードか何かを見せることができますか?私はこれを1ヶ月以上にわたって実装しようとしています。 – EmptyStack

+0

これをリアルタイムで実行するには、glslでOpenGLシェーダを作成してみてください。基本的な擬似コードアルゴリズムは、次のようなものになります: 'pixelColor =(old_h、old_s、old_v); pixelDiff =(touched_h - old_h、touched_s - old_s、touched_v - old_v); resultColor =(new_h - pixelDiff.h、new_s - pixelDiff.s、new_v - pixelDiff.v); ' – user1118321

+0

タッチされた色に基づいてresultColorを計算しても、車の色は単色ではないため、均一な出力は得られません。たとえば、車の中の暗い色に触れた場合、その出力は1つのバリアントになります。車の明るい色を選択すると、出力はさまざまな形になります。 – EmptyStack