【入門】微分フィルタ(MATLAB)【数値計算】

【入門】微分フィルタ(MATLAB)【数値計算】 数値計算
【入門】微分フィルタ(MATLAB)【数値計算】

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

の、
MATLAB,Python,Scilab,Julia比較 第3章 その32【微分フィルタ⑧】

を書き直したもの。

Sobelフィルタの実験。
今回はMATLABで実施。

Sobelフィルタ【再掲】

今回からSobelフィルタの実験開始。
まずはMATLABから。

Sobelフィルタと実験手順を再掲しておこう。

Sobelフィルタ

\(
K_{sbl}=
\begin{bmatrix}
1 \\
2 \\
1 \\
\end{bmatrix}
\begin{bmatrix}
-1 & 0 & 1
\end{bmatrix}=
\begin{bmatrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1 \\
\end{bmatrix}
\)

実験手順

  • 画像の読み込み
  • ガウシアンフィルタ用のカーネル用意
  • Sobelフィルタ用のカーネル用意
  • SDTVグレースケール化実施
  • ガウシアンフィルタ実施
  • Sobelフィルタ実施
  • 各Sobelフィルタの結果の合成
  • 画像の書き出し

MATLABコード

MATLABコードはこうなる。

convolution2d.m

function out = convolution2d(img, kernel)
    [m, n] = size(kernel);  % カーネルサイズ取得
    
    % カーネル中心からみた幅
    dy = int64(fix((m-1)/2));  % カーネル上下幅
    dx = int64(fix((n-1)/2));  % カーネル左右幅
    
    [h, w] = size(img);         % イメージサイズ
    out = zeros(h, w);          % 出力用イメージ
    
    % 畳み込み
    for y = dy+1:(h - dy)
        for x = dx+1:(w-dx)
            out(y, x) = sum( sum( double(img(y-dy:y+dy, x-dx:x+dx)).*kernel ) );
            %imgTmp = double(img(y-dy:y+dy, x-dx:x+dx));
            %out(y, x) = imgTmp(:)'*kernel(:);
        end
    end
end

sobel_test.m

function sobel_test()
    % 入力画像の読み込み
    img = imread('dog.jpg');
    r = img(:,:,1);
    g = img(:,:,2);
    b = img(:,:,3);
    
    % ガウシアンフィルタ用のkernel
    kernel_gauss = [ 1/16  2/16  1/16; ...
                     2/16  4/16  2/16; ...
                     1/16  2/16  1/16];
    % Sobelフィルタ用のKernel
    kernel_sx = [-1  0  1;...
                 -2  0  2;...
                 -1  0  1];
    kernel_sy = kernel_sx';
    
    % SDTVグレースケール
    gray_sdtv = [0.2990 * r + 0.5870 * g + 0.1140 * b ];
    
    % ガウシアンフィルタ
    img_g = convolution2d(gray_sdtv, kernel_gauss);
    
    % Sobelフィルタ
    img_sx = convolution2d(img_g, kernel_sx);
    img_sy = convolution2d(img_g, kernel_sy);
    imwrite(uint8(fix(abs(img_sx))),'dog_sx.jpg');
    imwrite(uint8(fix(abs(img_sy))),'dog_sy.jpg');
    
    % 合成
    img_s = sqrt( img_sx.^2 + img_sy.^2 );
    imwrite(uint8(fix(img_s)),'dog_s.jpg');
end

処理結果

そして処理結果。

Sobelフィルタ(MATLAB)

考察

前回のSobelフィルタの結果と一緒であり、
期待通りの動作をしている。

と言いたいところだが、
実は、前回見せたSobelフィルタはMATLABで実施したものなので、一緒であることは当たり前だったりする。
さすがに一個一個手計算するわけにもいかず、MATLABを使うしかなかった・・・。

まずはMATLABでの結果が正しいものとして、他の環境、他の言語と比較していくこととする。

まとめ

  • MATLABでSobelフィルタを実施。
  • 想定通りの結果が得られた。
    • というより、前回までの結果が実はMATLABで実施したものだった。
    • 他の環境、言語でも同様の結果が得られるかが確認ポイントになる。

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

タイトルとURLをコピーしました