画像から影を削除するにはどうすればよいですか?


17

この画像があります

ここに画像の説明を入力してください

画像から影を取り除きたいです。特定の形態学的操作などのさまざまな方法を使用して、シャドウを削除していることを知っています。

同じ画像用にこのマスクを作成しました

ここに画像の説明を入力してください

私が作成したこのマスクを使用して試すことができる他の方法はありますか?

編集

要求されたものと同じサイズの入力画像とマスク:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

編集2:1D不変画像を生成しましたが、完璧ではありません

  I = imread('shadow.jpg');
       J = im2double(I);

      R = J(:,:,1);
      G = J(:,:,2);
      B = J(:,:,3);

     [len,wid] = size(R);

     % Generation of 2-D Log Chromaticity Image.
     for i = 1:len
        for j = 1:wid
           if ((R(i,j)*G(i,j)*B(i,j))~= 0)
              c1(i,j) = R(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c2(i,j) = G(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c3(i,j) = B(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
           else
              c1(i,j) = 1;
              c2(i,j) = 1;
              c3(i,j) = 1;
        end
    end
end

rho1 = mat2gray(log(c1));
rho2 = mat2gray(log(c2));
rho3 = mat2gray(log(c3));

X1 = mat2gray(rho1*1/(sqrt(2)) - rho2*1/(sqrt(2)));                                         %(1/sqrt(2); -1/sqrt(2); 0)
X2 = mat2gray(rho1*1/(sqrt(6)) + rho2*1/(sqrt(6)) - rho3*2/(sqrt(6)));   %(1/sqrt(6); 1/sqrt(6); -2/sqrt(6))

theta = 120;

InvariantImage = cos(theta*pi/180)*X1 + sin(theta*pi/180)*X2;
imagesc(InvariantImage); colormap(gray)

ここに画像の説明を入力してください

ここで私が間違っていることを理解できませんか?


良い質問!マスクされた領域の輝度を上げてみましたか?
ディマ

5
ここに私の答えをチェックしてください:dsp.stackexchange.com/questions/454/...
datageist

簡単に言えば、2つの異なる表面の反射率は、絶対的な観点と、直接光と間接光の反射方法の両方で異なります。したがって、彼らは影の中にいることに対して異なる反応を示し、影を取り消すために異なる式を必要とします。
ダニエルRヒックス

2次導関数を使用したエッジ検出、勾配を使用したエッジ検出、ラプラシアン演算子など、他の方法があります。

回答:


11

シャドウ検出を扱ってシャドウマスクを生成する多数の出版物があります。実際、以前の投稿で言及されたものなど、実際にシャドウを削除する出版物もあります。必要に応じて、リストにいくつか追加できます。しかし、問題は解決されるには程遠い私見です。クイックスタートでは、シャドウマスクを指定して、次の2つのアプローチを提案します(過去に試しました)。彼らは間違いなく影を減らします-常にシームレスではないだけでなく、同様の方法で影の除去を扱っている出版物があると確信しています(私ではありません)。

  • ここで説明する勾配ドメイン操作テクニック(CおよびMatlabコードを提供):http ://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html 勾配積分アプローチは、多くの画像処理に使用できます。問題については、スライド/プレゼンテーションをご覧ください。

    一般的な考え方:

    1. すべてのカラーチャネルの空間微分(勾配画像)を計算します。
    2. シャドウマスクのシャドウ境界を使用して、シャドウ境界でゼロに近く、シャドウエッジに沿って指定された近傍内、つまり特定のエッジポイントに直交する範囲内で1に増加するウェイトマスクを生成します。
    3. (2.)のウェイトマスクにすべてのグラデーション画像を乗算して、シャドウ境界/エッジを縮小/減衰します。
    4. 上記のリンクのコードを使用して、グラデーション画像を統合します。
    5. 私の経験から、RGB画像の場合、元の画像の個別のチャネルの平均を計算し、これらの値に一致するように統合画像をスケーリングして、「面白い」色アーチファクトを防ぎます。
  • 元の画像ドメインでの輝度操作。

    1. シャドウマスクを使用して、シャドウリージョンの外側にあるウェイトマスクを生成します。これは、シャドウ境界を横切る滑らかな遷移(上方向)と、シャドウリージョン内の1より大きいスケール係数を持ちます。前の投稿で示唆されたように、スケール係数は、シャドウ領域の平均輝度と平均輝度を使用して、シャドウ領域を直接囲む領域から推定できます。
    2. 元の画像(チャネルごと)にウェイトマスクを乗算し、クリッピングの対象にします。

また、HSVなどのさまざまなカラーモデルを使用して、輝度や明るさを直接表示し、色(色相/彩度)に関係なく変更できるようにしました。これは、基本的に明るさの操作のように機能します。つまり、滑らかなウェイトマスクを生成し、輝度チャネルで乗算します。たぶん2つのアプローチ、すなわち勾配積分と輝度操作は巧妙な方法で組み合わせることができますが、誰かもおそらくそれを以前に試したことがあるでしょう。

Derikさんのお役に立てば幸いです。


2
リンクは死んでいるようです。ここにキャッシュバージョンがあります。
デルガン

9

このイメージは以前見たことがあります。実際、ここでは、あなたが解決しようとしているトピックに関するまさに論文の中にあります。サイモンフレイザー大学の同じ研究グループからの別の論文でフォローアップ。これらは両方とも、照明の不変性のために色を解決する問題の良い紹介になります。


はい、私はそれを知っていますが、同じ問題
-vini

@vini:あなたがあなたが何に敵対しているか知っているべきだと読んだなら、単純な形態学的操作はそれを削減するつもりはありません。他に何を読んで試しましたか?必要に応じて他の論文を提案できます。
Emre

@Emre私は影の効果があまり成功しないように明るさを変更しようとしています..エッジマップを使用してこの影を何らかの方法で隠すことができます..はい私はモルフォログカル操作が役に立たないことがわかりましたimsubtract (matlab)シャドウを削除するには
vini

5
@vini:この問題は、ワンライナーソリューションを超えています。リンクされた論文(および他の論文もあります)はほとんどの場合既に問題を解決しているので、何か新しいことをしたい場合は、それらの弱点を見つける必要があります。慎重に。通常、ディスカッションと結論のセクションで問題に言及しています。対数色度不変の投影アプローチは、私にとって最も有望なようです...
Emre

4

シャドウ検出について説明するいくつかの方法は、基本的に既知の背景に対して機能します。ピクセルの色を見ただけでは、とは絶対的な概念ではありません。ただし、参照なしで影を識別する必要があります。

この問題は難しいものですが、簡単な解決策があります-すぐにこれは最良の解決策ではないかもしれませんが、それでもある程度の見通しを得るのに役立つかもしれません。

HSLドメインの画像コンポーネントを調べてみましょう

色相色相コンポーネント、
飽和彩度コンポーネント、 明度明度コンポーネントです

明度は画像のグレー相当に密接に対応し、シャドウは本質的に

シーンの反射が局所的に減衰する半透明領域。

ここから。

したがって、画像の灰色の部分で同じことを識別できる暗闇と呼ばれる反射率を低下させるオーバーレイです-しかし、色の部分(色相および彩度がいくらか)で相互作用がはるかに少ないことがわかります。

さて、ここで、2つの画像を作成できます。

  1. この最初の画像では、明度成分を削除しています(固定平均値に置き換えられています)
    ここに画像の説明を入力してください

  2. 2番目の画像では、同じ方法で彩度コンポーネントを削除しました 彩度の削除

明度は保持されているが、彩度が削除されていても、影に関する重要な情報はそのままであることがわかります。明度を削除すると、影の情報は大幅に削除されます。これは完全ではありませんが、本当に影が背景から何であるかを区別できる重要な機能になります。

これに基づいて、「明度が除去された」画像を背景として扱い、他の画像を入射画像として扱い、この2つの情報に基づいて画像を分割できます。そのため、影が大きな役割を果たしていない地域では、差がはるかに小さくなる可能性があります。影が存在する場合、そのセグメントは高いエラーを示します。

または、両方の画像に独立したセグメンテーション(領域の拡大など)を適用することもできます。彩度が除去された画像には、明度が除去された画像には存在しない追加のセグメントがありますが、これはシャドウセグメントにすぎません。

注:HSL-lightness-removedイメージをオリジナル自体と区別できます。また、HSC色空間とYCbCrで同様のことを試してください。


2

マスクされた領域(影)のヒストグラムを取得し、線形の色変換を適用して、マスクされた領域のヒストグラムと残りの画像を一致させることができます。

変換のスケールファクターは無視できると思います。明るさを調整するだけでよいので、2つのセグメント(影、周囲)の平均の明るさを取得して、その差を適用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.