1

私はコンピューター ビジョンの分野に参入しようとしています。まず、MATLAB にソーベル フィルターを実装しました

コードは次のとおりです。

image = double(image);
kernelx = [ -1, 0, 1;
           -2, 0, 2;
          -1, 0, 1];

kernely = [  1, 2, 1;
             0, 0, 0;
            -1, 0, 1];

height = size(image,1);
width = size(image,2);
channel = size(image,3);

for i = 2:height - 1
    for j = 2:width - 1
        for k = 1:channel
            magx = 0;
            magy = 0;
            for a = 1:3
                for b = 1:3
                    magx = magx + (kernelx(a, b) * image(i + a - 2, j + b - 2, k));
                    magy = magy + (kernely(a, b) * image(i + a - 2, j + b - 2, k));
                end;
            end;     
            edges(i,j,k) = sqrt(magx^2 + magy^2); 
        end;
    end;
end; 

これは私がテストした画像です:

結果は次のとおりです。

ここからどこへ行けばよいかわかりません。線の細線化またはしきい値処理を調べてみましたが、これをより適切に実行するにはどのような手順を踏む必要がありますか?

4

2 に答える 2

2

結果第一

ソーベルに轢かれた猫

1 カーネルのタイプミス

Bharat Singhが指摘したように、あなたの y-Kernel は間違っているように見えます。(後で分析すると、結果が変わることが示されていますが、それは主な問題ではありません。) 必要に応じて、以下のコードで元のカーネルを使用して、結果を確認できます。(後世の方へ:)kernely(3,:) = [-1, 0, 1];基本的には入力画像のように見えます。

2 Convolution を使用してデバッグを高速化する

他のことをする前に、Matlab が提供する畳み込み関数を使用してください。また、高速化するには、 を使用しますconv2。実験中は、外側の-loopparforの代わりに使用したい場合があります。for畳み込みは私のマシンでは瞬時に行われ、parforバージョンには数分かかります。

3imshow問題を起こしている

という名前の代替手段がありimagesc、画像を自動的にスケーリングします。または、 に電話することもできますimshow(image, [])。しかし、この場合の問題は、各チャネルは正しく見えるが、Matlab によるチャネルの自動ミキシングが機能しないことです。(それらはもはや RGB ではなく、R チャネル導関数 |dR| などのマグニチュードに似ていることを思い出してください。)

結果の各チャネルを個別に ( imshow(E(:,:,1), []))、またはユークリッド平均 (私のコードを参照) として見て、これを確認してください。実行imshow(E, [])すると、ハイライトが吹き飛ばされます。最初に通過しても同じことが起こりますrgb2gray

コード

image = imread('cat.jpg');

image = double(image);
kernelx = [ -1, 0, 1;
           -2, 0, 2;
          -1, 0, 1];

kernely = [  1, 2, 1;
             0, 0, 0;
            -1, -2, -1];

height = size(image,1);
width = size(image,2);
channel = size(image,3);

edges = zeros(height, width, channel);

if exist('chooseSlow', 'var')
    parfor i = 2:height - 1
        for j = 2:width - 1
            for k = 1:channel
                magx = 0;
                magy = 0;
                for a = 1:3
                    for b = 1:3
                        magx = magx + (kernelx(a, b) * image(i + a - 2, j + b - 2, k));
                        magy = magy + (kernely(a, b) * image(i + a - 2, j + b - 2, k));
                    end;
                end;
                edges(i,j,k) = sqrt(magx^2 + magy^2);
            end;
        end;
    end;
end

%% Convolution approach
E = zeros(height, width, channel);
for k=1:channel
    Magx = conv2(image(:,:,k), kernelx, 'same');
    Magy = conv2(image(:,:,k), kernely, 'same');
    E(:,:,k) = sqrt(Magx .^2 + Magy .^2);
end

imshow(sqrt(E(:,:,1).^2 + E(:,:,2).^2 + E(:, :, 3) .^2 ), []);
print('result.png', '-dpng');
于 2014-08-26T14:07:23.020 に答える