1

私の英語がうまくないので、私は自分の問題を 2 回説明しました :/

最初の説明:

撮影した画像の各ピクセルの RGB マトリックスがあります。

さらに、実際の値を知っている3つのピクセルのRGBがあります(写真を撮った後、光のためにピクセルのRGB値が変更されます)。

元の画像の色を正確に取得できるように、最小二乗法を使用するためにこれら 3 つの既知の RGB を使用するにはどうすればよいですか?

2番目の説明:

カメラでいくつかのリンゴの写真を撮らなければなりません。部屋と路上で同じリンゴを撮影すると、同じリンゴなのに、同じ色のリンゴではない画像が得られます。これは、通りの光が私の部屋の光ではないからです。

この問題を解決するために、リンゴの近くに、RGB がわかっている 3 つの円 (赤、緑、青) を配置します。たとえば、3 つの円があります。

赤丸 -> [241 25 13]

緑の丸 -> [12 239 41]

青い丸 -> [35 28 237]

次に、3 つの円でリンゴを撮影します。3 つの円の RGB が変更されたことを知っています。

赤い円は [229 42 32] です。

緑の丸 -> [24 241 42]

青い丸 -> [29 26 230]

さて、この情報 (3 つの円の入力と出力の RGB) を使用して、すべての画像 (リンゴと 3 つの円) の色を修復します。

私の入力は次のとおりです。

(最初の 3 つの円の RGB、撮影後のこれらの円の RGB)

出力は関数でなければなりません: (R,G,B) -> (新しい R, 新しい G, 新しい B)。

そのため、関数は画像内のすべての RGB を修復する必要があります。

私が前にさせた例のために:

赤い丸 [229 42 32] は元の [241 25 13] に変わります。

緑の円 [24 241 42] -> [12 239 41]

青い円[29 26 230] -> [35 28 237]

したがって、RGB が [142, 124, 211] のリンゴを 1 つ撮影して取得した場合、その RGB を使用して関数を実行し、このリンゴの真の色を取得したいと考えています。

最小二乗法で使用できると誰かが私に言いました。

4

1 に答える 1

4

あなたはこれを行うことができます:

In = [   229    24    29
          42   241    26
          32    42   230  ];

Out = [  241    12    35
          25   239    28
          13    41   237 ];

そして計算します:

A = Out / In;   

A入力色から目的の出力色への目的の線形変換になります。ただし、これは 1 つのモデルに過ぎず、これが特に色に適しているかどうかを判断するのはあなた次第です。カラー キャリブレーションに関して多くの作業が行われていることは確かですが、これについて知っていると主張するつもりはありません。

また、/通常の分割ではないことに注意してください。基本的に行うのはMatlabのオーバーロードですOut * inv(In)。実際にはこれよりも少し多くのことを行います。詳細については、を参照help mrdivideしてください。

次に、新しい線形変換を適用するAには、カラー イメージに適用します。特定の入力ピクセルについて、inrbg = [ R ; G ; B ];計算します

  outrgb = A * inrgb;

そして、これを画像全体に適用できます。

残念ながら、許容強度範囲外の値が得られ、元に戻す必要があります。これは、純粋な線形モデルが必ずしも優れたモデルではないことを示しています。少なくとも、これでどこかで始めることができます。

もう1つ、上で書いたことは最小二乗法を明示的に使用していませんが、次のような色の入力と出力の推定値がさらにある場合

>> InN = [In randn(size(In))+In];  % just an example to get more columns, don't use this
>> InN

InN =

  229.0000   24.0000   29.0000  228.2382   25.2329   28.9302
   42.0000  241.0000   26.0000   41.3748  240.6159   26.5301
   32.0000   42.0000  230.0000   32.2829   42.0552  229.3372

>> OutN = [Out randn(size(Out))+Out]; % just an example to get more columns, don't use this
>> OutN

OutN =

  241.0000   12.0000   35.0000  241.1487   10.8441   33.8811
   25.0000  239.0000   28.0000   25.3679  240.0666   27.0684
   13.0000   41.0000  237.0000   12.1927   41.2091  236.9066

次に、これA = OutN / InNもまだ機能し、それを解決するために何を使用していると思いますか? 効果的な最小二乗法。

于 2012-06-08T21:25:14.490 に答える