2016-04-28 7 views
1

私は以下の式を実装しようとしています。今後の問題は、この方程式については必ずしもありませんが、より一般的には、画像処理にゼロで部門に対処する方法について:画像処理(またはPRNU推定)の「ゼロ除算」ハンドル

ここ

enter image description here

Iはイメージです、Wは、画像間の差であるとそのノイズ除去されたバージョン(したがって、Wは画像内のノイズを表す)であり、Kは、同じカメラのd画像から得られた推定指紋です。すべての計算はピクセル単位で行われます。したがって、式は、行列乗算を伴うではない。デジタル指紋を推定するアイデアについては、wikipedia articleまたはscientificpapersのような対応する文献を参照してください。

しかし、私の問題は、Imageが0の値を持つピクセルを持つ場合に発生します。完璧な黒(我々は1つの画像、k=1を持っているとしましょう、次のピクセル値が等しくない場合、ゼロは次の画像のピクセル値によって偶然上書きされません)。 次に、私は0で除算します。これは明らかに定義されていません。

はどうすればこの問題を克服することができますか?私が思いついた1つの選択肢は、計算を開始する前にすべてのピクセルに+1を追加することでした。ただし、ピクセル値の範囲が[0|255]から[1|256]にシフトするため、データ型がuint8であることが不可能になります。

他の著者はこのトピックについて読んでいますが、数値が範囲の境界線を近づけないとはしばしば考えません。たとえば、ピクセル値の式を計算するのは[5|250]です。数値的な問題ではなく、画像が完全に飽和しているか完全に黒くなっていると、その領域で指紋を正しく推定することさえできないと彼らは言う。

しかし、再び、私の主な関心事は、このアルゴリズムは最良の実行方法についてではなく、一般的には:画像処理で0によって部門に対処する方法は?

+0

"I_kはイメージです"とはどういう意味ですか?画像の数学的モデルとは何ですか? – Matsmath

+0

これは2Dマトリックスです。例えば。マトリクスの各エントリは画像内の1つのピクセルに対応します。マトリックスの寸法は画像の解像度と同じです。 すべての演算は、I_k(x、y)の1ピクセルを取り、それを分子のW_k(x、y)で乗算するので、数学は通常の「行列計算ルール」に従わないことに注意してください、例えば) – muuh

+0

私が思ったように。そして、行列I_k^2の和で*を割り算するとどういう意味ですか? – Matsmath

答えて

0

1つの解決策は、除算の代わりに減算を使用することです。減算はスケール不変ではありませんが、それは翻訳不変です。

[例。比率は常に0と1の間の正規化された値になります。 1を超える場合は逆にすることができます。あなたが部門に対処する必要がありますEventualy]

をあなたは引き算で同じ正規化を持つことができますが、変数によって達成max値を見つける必要があります。黒い画像をそれ自体で分割することは適切なテーマです。値をある範囲に変換してから変換することができます。

ただし、5/8は55/58と同じではありません。だから、これは相対論的な方法でしか取ることができません。正確な比率を把握したい場合は、元の間隔に従うことをお勧めします。特別なケースとして扱います。たとえばdenom == 0の場合は、何かを行う。 num == 0、denom == 0 0/0の場合、それは私たちが同一性を持つことを意味します。まるで1/1の場合とまったく同じです。 PRNUと指紋推定で

0

あなたはジェシカ・フリドリッチのウェブページでMatlabの実装をチェックすると、彼らは基本的にあなたが述べたように、飽和および低強度のピクセルを取り除くためにマスクを作成します。次に、イメージ行列をイメージを32ビット浮動小数点にするシングル(I)に変換します。画像に1を加えて除算します。

あなたの一般的な質問には、画像処理では、私はマスクを作成し、ゼロ値のピクセル値に1を加えるのが好きです。

img=imread('my gray img'); 
a_mat=rand(size(img)); 

mask=uint8(img==0); 
div= a_mat/(img+mask); 

これにより、ゼロ除算が防止されます。 (テストされていませんが動作するはずです)