1

Matlabでガウスエッジ演算子のラプラシアンを実行するつもりです..

これが私の持っている知識です

LOG operators are second-order deriatives operator. Second order deriatives operator result in zero-crossing. At the step, position where 1st deriative is maximum is where the second deriative has zero crossing.

使用したマスクは mask = [0 1 0; 1 -4 1; 0 1 0];

元の画像は

ここに画像の説明を入力

私が得る出力は元の画像からのものです

ここに画像の説明を入力

私の質問は、画像のエッジが黒(= 0)ではなく白く見えるのはなぜですか。黒くするべきですか?私は正しいですか、それとも間違っていますか? 誰でも説明できますか?

畳み込み関数:

function [ I2 ] = image_convolution(I,w,G)
m= (w-1)/2;
N= size(I,1);
M=size(I,2);
for i=1:N
    for j=1:M
        if (i > N-m-1 || j > M-m-1 || i<m+1 || j <m+1)
            I2(i,j) = 0;
            continue;
        end
        sum1 = 0;
        for u=1:w
            for v=1:w
                sum1 = sum1+I(i+u-m-1,j+v-m-1)*G(u,v);
            end
        end
        I2(i,j)=sum1;
    end
end

end
4

3 に答える 3

9

簡単なテストですべての質問に答えることができます。

log_mask = [0 1 0; 1 -4 1; 0 1 0];

vertical_bar = zeros(11);
vertical_bar(:,5) = 1;
bar_filtered = image_convolution(vertical_bar, 3, log_mask)

box = zeros(11);
box(3:7,3:7) = 1;
box_filtered = image_convolution(box, 3, log_mask)

figure;
subplot(2,2,1); imshow(vertical_bar,[]); title('Vertical Bar');
subplot(2,2,2); imshow(bar_filtered,[]);title('Vertical Bar LoG Filtered');
subplot(2,2,3); imshow(box,[]);title('Box');
subplot(2,2,4); imshow(box_filtered,[]);title('Box LoG Filtered');


# Output:
#
# bar_filtered =
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0

#box_filtered =

# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     1     1     1     1     1     0     0     0     0
# 0     1    -2    -1    -1    -1    -2     1     0     0     0
# 0     1    -1     0     0     0    -1     1     0     0     0
# 0     1    -1     0     0     0    -1     1     0     0     0
# 0     1    -1     0     0     0    -1     1     0     0     0
# 0     1    -2    -1    -1    -1    -2     1     0     0     0
# 0     0     1     1     1     1     1     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0

グラフで表示されたフィルタリング結果: ここに画像の説明を入力

見る?ご想像のとおり、正確に境界線上のピクセルには実際に負の値があります。一方、境界線のすぐ隣のピクセルは正の値です。信号が一定である領域の値よりも大きな値。これらは、結果に表示される「白い」値です。

数学的にも、それは簡単に説明できます。今まで使っていたマスクを見て

使用されるログ マスク

大きな谷の周りの小さな山が見やすいようにプロットしました。簡単に言えば、境界の周りのフィルタリングされた値が残りのピクセルよりも大きくなるため、この「境界認識」の効果があります。

matlab function で作成したマスクをプロットしましたfspecial('log')。このマークでは、ピークがさらに見つけやすくなっています。 ここに画像の説明を入力

よろしくお願いします

于 2012-04-13T20:49:34.783 に答える
0

簡単な解決策:使用

imshow(image,[])

それ以外の

imshow(image)

于 2016-02-16T01:21:55.163 に答える
0

これは、畳み込みの計算方法に関係しています。カーネル (マスク) が境界で畳み込まれると、カーネルは元の画像の外側の領域に到達します。そこで何をすべきかについていくつかのオプションがあります:

  • その外側の領域の値は 0 であると想定できます。
  • 境界線と同じ値を持ち、
  • または、イメージが周期的 (円形) であるかのように、イメージの反対側と同じにする。

画像の外側の領域がゼロであると想定され、境界値が高い場合 (画像内など)、高い値からゼロにステップしているため、エッジが検出されます。

imfilter を使用する場合、関数は既定でこの領域を 0 と見なします。オプション 'replicate' を使用すると (外側の領域は境界線と同じになります)、この問題を解決する必要があります。

詳細については、公式ドキュメントを参照してください: http://www.mathworks.com/help/toolbox/images/ref/imfilter.html

また、外側の領域が結果に含まれるため、結果の画像のサイズが異なります。imfilter を使用する場合、この領域はデフォルトでトリミングされます。

デフォルトで両方の問題を抱えている conv2 関数を使用していると思います。

PS: 私はしばらくこれを使用していません。imfilter が私が言ったのとまったく同じように機能するか、または他に何か必要な場合はお知らせください。

于 2012-04-12T16:23:42.620 に答える