edge関数の不可解な動作
6 views (last 30 days)
Show older comments
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
Answers (1)
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
Kei Otsuka
on 21 Nov 2017
singleとdoubleでも違いが出ますし、フィルタのカーネルのサイズ、画像端のパディングの方法などを変えても異なった結果になります。 今回はsingleのデータ型、カーネルサイズ13、logフィルタ係数、パディングをreplicateとして当該箇所を畳み込んだときにこのような結果になったということですが、 フィルタ係数はop変数で確認できますし、フィルタ処理をimfilterを利用せずにconv2などで実現していただければ、このような結果が得られた理由を論理的に説明できるレベルまで落とし込めると思います。
See Also
Categories
Find more on イメージのセグメンテーション in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!