バックナンバーはこちら。
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
処理結果

そして処理結果。

考察

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

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

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

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

そりゃそうか。

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

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