MATLAB Answers

jocochin
0

edge関数の不可解な動作

Asked by jocochin
on 20 Nov 2017
Latest activity Commented on by Kei Otsuka
on 21 Nov 2017
edge関数の動作について質問です。添付のimage.bmpを読み込んで下記コードを実行すると、
image2.bmpのような画像が得られます。
入力画像は点対称な幾何学模様のため、出力も同じようなものが得られることを期待していたのですが、
image2右下のように非対称な要素が現れています。
どうしてこのようになってしまうのでしょうか。
#追記
使用環境:MATLAB バージョン: 9.3.0.713579 (R2017b) ,Image Processing Toolbox バージョン 10.1 (R2017b)
if true
im = uint8(rgb2gray(imread('image.bmp')));
imshow(im);
im_edge = edge(im,'log',0);
imshow(im_edge);
end

  0 Comments

Sign in to comment.

1 Answer

Kei Otsuka
Answer by Kei Otsuka
on 20 Nov 2017

選択しているエッジ検出のLOGアルゴリズムは、画像を2階微分した結果にガウシアンフィルタを施し、 ゼロクロス点を探索する形になります。ここで、アルゴリズムを理解するために、まずは画像に ラプラシアンフィルタを適用してみます。
img = imread('image.bmp');
gray = rgb2gray(img);
gray = im2single(gray);
op = fspecial('log',13,2);
b = imfilter(gray,op,'replicate');
結果はどうなったかsurfプロットで見てみます。
figure, surf(b), shading interp
一見、期待したようなゼロクロスが得られているように見えます。 ここで、この画像bに対して局所最大値を求めてみます。
bw = imregionalmax(b);
imshow(bw)
なぜこのような結果が得られたのでしょうか。実は画像bには一見解り難い極値が存在しています。 画像bの右下の領域のある2点の輝度値を見てみます。
b(240,245)
b(220,245)
以下のような結果が返ってきていると思います。
ans =
single
1.3169483e-09
ans =
single
-2.6921043e-09
今回のケースではthreshold値が0であるため、このような極値もエッジとして拾ってしまい、結果として意図しない閉輪郭が含まれます。LOG法以外にもZerocross法, Canny法でも同様の振る舞いが見られます。 フィルタの応答によるもので、アルゴリズム的には正しい振る舞いですので、LOG法を希望される場合には閾値を適切に設定して使ってみてください。

  2 Comments

jocochin
on 21 Nov 2017
回答ありがとうございます。
計算過程で極値が現れ、エッジとして拾われてしまったということは理解しました。
ここでもうひとつ疑問が残っているのですが、なぜ右下のみに極値が現れているのでしょうか。
入力画像やオペレータの対象性を考えると、いまいちピンときません。
一方で、例示していただいたコードの3行目を以下のように変えると、
%gray = im2single(gray);
gray = im2double(gray);
得られた局所最大値は、
このようになりました。
この結果なら納得ができます。
singleとdoubleで違いが出ていますので、浮動小数点誤差がなにかしらの影響しているのでしょうか。
気になったため質問いたしました。 実使用の上では、極値の影響が出ない閾値設定を行いたいと思います。
Kei Otsuka
on 21 Nov 2017
singleとdoubleでも違いが出ますし、フィルタのカーネルのサイズ、画像端のパディングの方法などを変えても異なった結果になります。 今回はsingleのデータ型、カーネルサイズ13、logフィルタ係数、パディングをreplicateとして当該箇所を畳み込んだときにこのような結果になったということですが、 フィルタ係数はop変数で確認できますし、フィルタ処理をimfilterを利用せずにconv2などで実現していただければ、このような結果が得られた理由を論理的に説明できるレベルまで落とし込めると思います。

Sign in to comment.