【入門】ガウシアンフィルタ(Julia)【数値計算】

【入門】ガウシアンフィルタ(Julia)【数値計算】 数値計算
【入門】ガウシアンフィルタ(Julia)【数値計算】

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

はじめに

の、
MATLAB,Python,Scilab,Julia比較 第3章 その24【ガウシアンフィルタ⑩】

を書き直したもの。

畳み込み演算のガウシアンフィルタの話になる。
今回はJuliaで実施してみる。

使用する畳み込みカーネルと画像

まずは畳み込みカーネルと画像の再掲。

畳み込みカーネル

\(
\displaystyle K_{3\times3}=\frac{1}{16}
\begin{bmatrix}
1 & 2 & 1 \\
2 & 4 & 2 \\
1 & 2 & 1 \\
\end{bmatrix}
\)

画像

犬と自転車

これをJuliaで実現する。

Juliaコード

Juliaコードは以下になる。

using Images

# 畳み込み演算
function convolution2d(img, kernel)
    (n, m) = size(kernel); # カーネルサイズ取得
    
    # カーネル中心からみた幅
    dy = Int64((n-1)/2);  # カーネル上下幅
    dx = Int64((m-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( img[y-dy:y+dy, x-dx:x+dx].*kernel );
        end
    end
    return out;
end

function gaussian_test()
    img = channelview(load("dog.jpg"));
    
    (c, h, w) = size(img);
    
    # ガウシアンフィルタ用のkernel
    kernel_gauss = [ 1/16  2/16  1/16; 
                     2/16  4/16  2/16; 
                     1/16  2/16  1/16];
    img_gauss = zeros( c, h, w );
    
    # ガウシアンフィルタ
    img_gauss[1,:,:] = convolution2d(img[1,:,:], kernel_gauss);
    img_gauss[2,:,:] = convolution2d(img[2,:,:], kernel_gauss);
    img_gauss[3,:,:] = convolution2d(img[3,:,:], kernel_gauss);
    
    img_gauss = colorview(RGB, img_gauss);
    save("dog_gaussian_j.jpg",img_gauss);

    return;
end

gaussian_test();

処理結果

そして処理結果。

犬と自転車、ガウシアンフィルタ、Julia

考察

これもMATLABに似た感じになる。
大きな差異は、画像の読み込み、書き込みでchannelview、colorviewを経由する必要がある点。

sumは、NumPy、Scilabと同じで、行列全体の総和が得られる。
dimsオプションを使うと、行、列の単位での総和が取れる。

Juliaは画像の構造が、
ch、高さ、幅
で埋まってる点に注意が必要。
これによって、convolution2dの画像データの渡し方が変わってくる。
他のツール、言語だと、
img(:,:,1)
なところが
img[1,:,:]
になってる。

ここらへんを意識できていれば、処理の流れとしては全く一緒にできるってことになる。

まとめ

  • Juliaでガウシアンフィルタを実施。
  • 畳み込み演算は関数化。
    • Juliaのsumは行列の総和。
    • 行、列の総和の場合はdimsオプションを使用。
  • RGB 3chに対して同じ処理を実施。
    • データ構造が大きく異なるので注意。

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

コメント

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