選択しているエッジ検出の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点の輝度値を見てみます。
以下のような結果が返ってきていると思います。
ans =
single
1.3169483e-09
ans =
single
-2.6921043e-09
今回のケースではthreshold値が0であるため、このような極値もエッジとして拾ってしまい、結果として意図しない閉輪郭が含まれます。LOG法以外にもZerocross法, Canny法でも同様の振る舞いが見られます。 フィルタの応答によるもので、アルゴリズム的には正しい振る舞いですので、LOG法を希望される場合には閾値を適切に設定して使ってみてください。