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

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

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/

はじめに

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

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

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)

考察

太郎くん
太郎くん

おー!
前回見た結果と一緒になったね!

フクさん
フクさん

というより、前回見せた結果がMATLABで実施したものだったりするんだけどねー。

太郎くん
太郎くん

じゃー、一緒で当たり前じゃん・・・。

フクさん
フクさん

一個一個て計算するわけにもいかないからね。
どれかの環境か言語で最初は実験しないと・・・。

太郎くん
太郎くん

そりゃそうか。

太郎くん
太郎くん

まぁ、MATLABの結果をまずは正しいものとして、
他の環境と言語でどうなるかってところかな。

まとめ

フクさん
フクさん

まとめだよ。

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

バックナンバーはこちら。

コメント

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