9

画像の特定の色をユーザーが選択した色に置き換える作業を行っています。色の置換には OpenCV を使用しています。

ここでは簡単に、私がどこから助けを得て、何を得たかを説明しました。

  1. 画像内の特定の色を変更するには? 上記のリンクの回答から手順を実行するか、基本的な考え方を取り入れました。そのリンクの正解で、その男は、色を置き換えるために色相を変更するだけでよいと言いました。

  2. その後、 iPhoneアプリケーションの画像の色置換のような問題 に遭遇しました(つまり、完全に初心者向けの色置換の良いコードです)
    その問題から、「彩度」も変更する必要があるという考えを得ました。


今、私は次のような問題に直面しています

「ソース画像が明るすぎる(つまり、高輝度)場合、色を暗い色に置き換えると、置き換えられた画像では暗いのではなく明るい色に見えます。これは、置き換えられた色が使用した色と一致しないように見えるためです。置換"

これは交換時の明るさを考慮していないために起こります。ここで私は立ち往生しています明るさを変更するための式またはアイデアは何ですか?

画像の明るさを目的の色の明るさに置き換えるとします。それはフラットな置き換えのように見え、画像は実際の影やエッジを失います。

編集:
ソースの明るさ(つまり、処理するピクセル)を交換することを検討している場合、1つの問題に直面しています。私のアプリケーションのシナリオに従って説明させてください。

たとえば、車の色を変更した後 (whiteAngl の説明のように)、新しく色を付けた車の一部を消去しています。繰り返しますが、消去された部分の色を変更していますが、消去後の色と消去前の色が一致しません。これは、処理されるピクセルが変更され、その明度が原因で、両方の時間で異なる明度が得られるためです。出力で色が変わりました。この問題を克服する方法

どんな助けでも大歓迎です

カラー画像 一部消去 再着色された

4

2 に答える 2

12

試したコードを見なければ、何を間違えたのかを推測するのは簡単ではありません。これがどのように行われるかを具体的な例で示すために、この車の醜い青色を変更してみましょう。

ここに画像の説明を入力

この短い python スクリプトは、HSV 色空間を使用して色を変更する方法を示しています。

import cv2
orig = cv2.imread("original.jpg")
hsv = cv2.cvtColor(orig, cv2.COLOR_BGR2HSV)
hsv[:,:,0] += 100
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('changed.jpg', bgr)

そしてあなたは得る: ここに画像の説明を入力

ウィキペディアでは、色相が 0 から 360 度の間であることがわかりますが、OpenCV の値については documentation を参照ください。画像のすべてのピクセルの色相に 100 を追加したことがわかります。画像の一部の色を変更したいと思いますが、おそらく上記のスクリプトからアイデアが得られるでしょう。

リクエストの濃い赤の車を入手する方法は次のとおりです。まず、赤いものを取得します。 レッドカード

メタリック感を抑えたダークレッド。 深紅の車

前述したように、色の光をシフトするために使用する方程式は、オブジェクトに使用するマテリアルによって異なります。ここで、車の金属素材を維持するための簡単で汚い方程式を思いつきました。このスクリプトは、最初の水色の車の画像から上記の濃い赤の車の画像を生成します。

import cv2
orig = cv2.imread("original.jpg")
hls = cv2.cvtColor(orig, cv2.COLOR_BGR2HLS)
hls[:,:,0] += 80 # change color from blue to red, hue
for i in range(1,50): # 50 times reduce lightness 
 # select indices where lightness is greater than 0 (black) and less than very bright 
 # 220-i*2 is there to reduce lightness of bright pixel fewer number of times (than 50 times), 
 # so in the first iteration we don't reduce lightness of pixels which have lightness >= 200, in the second iteration we don't touch pixels with lightness >= 198 and so on
 ind = (hls[:,:,1] > 0) & (hls[:,:,1] < (220-i*2))
 # from the lightness of the selected pixels we subtract 1, using trick true=1 false=0
 # so the selected pixels get darker
 hls[:,:,1] -= ind
bgr = cv2.cvtColor(hls, cv2.COLOR_HLS2BGR)
cv2.imwrite('changed.jpg', bgr)
于 2013-04-05T00:11:27.180 に答える
1

その通りです。色相だけを変更しても、明るさはまったく変化しません (または、知覚効果のために非常に弱くなります)。必要なのは、明るさも変更することです。そして、あなたが述べたように、明るさを目標の明るさに設定すると、すべてのピクセル値が失われます (彩度の変化のみが表示されます)。次は何ですか?

できることは、ピクセルの色相を変更し、さらに平均明度を一致させることです。これを行うには、処理するすべてのピクセルの平均輝度Bを計算し、すべての輝度値にターゲット カラーの輝度を掛けBt/BますBt

これを行うと、色相 (最初のステップによる) と 2 番目のステップによる明るさの両方が一致しますが、エッジは保持されます (平均の明るさのみを変更したため)。

これは、ヒストグラム マッチングの特殊なケースです。ここでは、ターゲット ヒストグラムに単一の値 (ターゲット カラー) があるため、平均値のみを適切な方法でマッチングできます。

そして、報奨金のリクエストに記載されている「信頼できる情報源」を探しているなら、私はハーバード大学のポスドクで、今年の Siggraph でカラー ヒストグラム マッチングに関する論文を発表する予定です ;) .

于 2013-04-06T03:55:58.783 に答える