2016-10-26 51 views
0

Gaussian filterimageJソフトウェアを使用して画像内のROIをぼかそうとしています。imageJぼかし半径とOpenCV Gaussian Blurシグマとの関係

imageJblur radius as 9という結果が表示されています。

今私はimageJと同じ操作を行うために対応するOpenCV C++ applicationを書こうとしています。 openCV

Gaussian Blur署名は以下の通りです:

C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

ImageJ blur radius of 9に対応sigmaXsigmaYは何?

私は、次のような多くのリソースを試してみました: Blur Radius

が、私はOpenCVと同じ結果を得ていないのです。

答えて

0

結果が「同じではない」方法を詳しく教えてください。 I:ImageJの中のぼけ半径は次のように定義される

「『半径』減衰の半径がガウシアンの標準偏差シグマすなわち、〜61%(-0.5)expに手段」(https://imagej.nih.gov/ij/developer/api/ij/plugin/filter/GaussianBlur.html#GaussianBlur-- ImageJのドキュメントからの) OpenCVで同じ方法で実装してはならない理由はありません。

しかし、私はImageJとOpenCVガウスのぼかしの間のこれらの違いも観察します。 私はこれらが全く同じにする解決策を持っていない瞬間のために、私は近くにそれらを得るために管理、および実装の1つの電位差と確かに1つの違いを確認できますが:

カーネルサイズ(電位差): カーネルサイズとガウス半径は2つの異なることをご存知ですか?カーネルサイズはイメージに適用されるカーネルのサイズです(3 * 3,5 * 5など)が、このカーネル内では任意の半径を持つガウスが論理的に存在します。しかしながら、カーネルの境界上で、ガウス関数が約0に減衰するように、カーネルのサイズはしばしば決定される。

これはImageJが自動的にカーネルを選択したため、半径に応じてカーネルが自動的に選択され、「罫線上のゼロへのガウス崩壊」条件が満たされます。 OpenCV関数は、sigmaを希望の半径に設定し、ksizeをゼロに設定した場合も同様です。問題は「彼らはどちらも同じようにしますか?」です。

ImageJの実装は、「ImageJでは、実際に使用されるカーネルのサイズは、正確には の精度に依存します。シグマ= 1の場合、16ビットおよび浮動画像の場合、カーネルは9ピクセル 幅が(2次元画像では9x9を与える)が、8ビットまたはRGB画像の場合は、 は7ピクセル幅です。 は256の異なる値しかない場合、非常に高い精度を必要としないためです。 Σ> = 8の場合、データは最初に縮小され、次にガウスぼかしが適用され、元のデータ点数にアップスケーリングするために補間が使用されます。最高の精度。"など、など(私は十分な評判を持っていないので、私はリンクを投稿することはできません" ImageJフォーラム "から来て、あなたはソースをしたい場合はこの引用符をGoogle)

私はOpenCVそのような操作をしたり、カーネルのサイズを違う方法で計算したりすると、異なる結果が得られます(Googleでは見つかりませんでした)。イメージ内のすべてのピクセルとその近傍に基づいてこのピクセルの新しい値を計算しますが、ガウスカーネルがイメージの境界からの距離よりも広い境界に近いピクセルはどうですか?アルゴリズムはそれをどのように処理しますか?私のイメージはもっと近く、私はメインOCVの実装とIJの実装の違いは境界ピクセルにありました。

まあそれはImageJのとOpenCVのは、異なるこれらの画素を処理判明:

のImageJのガウシアンを、「ImageJの中のすべての畳み込み演算と同様に、外の画像画素は、最も近いエッジ画素に等しい値を有していることを前提としています。 " (上記と同じImageJのドキュメントから)。

しかし、OpenCVのは、あなたが他のオプションを選択して、デフォルトの1、BORDER_REFLECT_101http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html)で、OpenCVの呼び出しでBORDER_DEFAULTと呼ばれることができます(少なくとも私はそれはそれはそう、境界線を使用して、別の方法のデフォルト境界線である、だと思います私はそれがガウスのデフォルトボーダーでもあると思います)。 BORDER_REFLECT_101境界を「鏡映」します(gfedcb | abcdefgh、リンクを参照)。

ImageJ(aaaaaaaa | abcdefgh)に近づくには、BORDER_DEFAULT=BORDER_REPLICATEを使用してください。これにより、2つの実装の間に近い結果が得られます(ただし、まったく同じではありませんが、さらに手がかりを見つけたら調査して編集します)。

[注:私はPython2.7(C++ではない)とOpenCV 3で作業していますが、この問題には影響しないと思います。

関連する問題