OpenCV CannyとMatLab Cannyの違いは何ですか?


8

MatLab Canny(MLC)がOpenCV Canny(OCC)と比べて非常に異なる理由を誰かが知っていますか?ML-CはOCCよりも正確で接続されたエッジを提供しますが、それはどのようにして可能ですか?私が尋ねる理由は、MLコードのプロトタイプをC ++に実装する必要があり、OpenCVを使用したかったからです。私が試した限りでは、MLのコードをエクスポートすることは実際には不可能です。

敬具、


3
しきい値やその他のパラメータ設定を確認しましたか?それらを提供しない場合、それらは自動的に選択され、戦略は変わる可能性があります。
Andrey Rubshtein

ねえアンドレイ、あなたが設定しなければ自動的に提供されることを知っている。しきい値を確認して変化させましたが、結果はMLの結果とどのような組み合わせでも同じ品質ではありません。
mchlfchr 2012年

私が知る限り、OpenCVはグラデーションにSobelを使用しています。MLはエッジのプロパティをより適切にモデル化しているため、グラデーションにガウスの近似を使用しているのでしょうか?よろしく
お願いします

次のように入力することができますedit edgeMatlabの中で、関連するケースを参照してください。それはすべてオープンソースです-私が知る限り組み込みはありません。
Andrey Rubshtein

はい、わかりますが、一部のルーチン(勾配計算など)については、これ以上深く理解することができません。そしてキャニーのルーチンは非常に長いので、私はここの誰かがすでにその経験をしたと思いました。;)だから誰も私に答えをくれなかったので、私は間違っていました。
mchlfchr 2012年

回答:


11

上記で提案したように、Matlab Cannyエッジ検出器は、「ドキュメントに記載されているように」「ガウスフィルターの導関数」を使用して勾配を計算します。言い換えると、Matlabは画像のガウスぼかしを行い、その平滑化された画像の勾配を検出します...すべて1つのファンシーフィルターを使用します。[詳細を知りたい場合は、edit edgeAndreyの提案どおりに入力してから、smoothGradient()関数までスクロールしてください。]

ぼかし操作は、画像に存在するノイズの量を大幅に減らし、多くの偽のエッジを取り除き、良いものを残します。

残念ながら、OpenCV Canny関数では、関数パラメーターを介して、使用するフィルターカーネルを変更できません。しかしながら。最初に入力画像をぼかしてから、このぼかした画像をキャニー関数に渡すことで、同じ結果を生成できます。

これにより、結果のエッジマップが大幅にクリーンアップされます。入力画像をぼかすために、私はOpenCVのGaussianBlur()関数をで個人的に使用していsigmaX=2ます。これは、Matlabのデフォルトのシグマを模倣しています。最適なぼかしカーネルサイズは場合によって異なりますが、Matlabではを使用して計算さfilterLength = 8*ceil(sigma);れるため、シグマ2の場合、カーネルサイズは(16,16)

ガウスぼかしフィルターとソーベルフィルターはどちらも線形であるため、ぼやけた入力画像をOpenCV Canny()関数に渡すことは、この擬似コードで示されているように、重ね合わせの原理によりMatlabが行うことと数学的に同等です(注:*はたたみ込み演算子です)。

// The Matlab method: the sobel and blur operations are combined into
// a single filter, and that filter is then convolved with the image
matlabFancyFilter = (sobel * blur);
gradient = matlabFancyFilter * image;

// Equivalent method: image is first convolved with the blur filter, and
// then convolved with the sobel filter.
gradient = sobel * (blur * image); // image is filtered twice

ここには、C ++を使用してこれを行う方法を示すOpenCV Cannyチュートリアルがあります。私はpythonの人なので、ここに私がやっていることがあります:

smoothedInput = cv2.GaussianBlur(image, (7,7), 2);
edges = cv2.Canny(smoothedInput, 25, 50);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.