はじめに
大学の講義課題です。
今回はエッジ検出をSobelフィルターを使って実装せよという課題です。
詳しい内容としてはSobelフィルターを通した結果に対してノルムを計算し、その平均値を算出、それと比較した大小でエッジを検出せよという内容でした。
さらにSobelフィルターを通す部分は既存の関数を使わずに自作せよ。という内容だったので少しだけ面倒ですが、寝起きの運動がてらやってみました。
Matlabを使って取り組めという指示があまり好きではないのですが、言語指定するのは学生のためになると思っているのかそれとも…
ソースコード
流れとしては画像を読み込み、グレースケール画像に変換する。
ラスタスキャンを行い、各画素ごとに計算領域の3*3行列を作成する。
Sobelフィルターに掛け合わせて(行列を掛け算してsum関数で全ての要素を足し合わせる)、ノルム計算(既存の関数normを利用)を行う。
ここまで来たら後は平均値(mean関数)を求めて、その平均値以上の要素を255に、それ以外を0にして出力します。
%画像の読み込み URL = 'img/input.jpg'; %相対パス RGB = imread(URL); %画像の読み込み GRAY = rgb2gray(RGB); %グレースケール化 clear URL RGB; %メモリ解放 %Sobelフィルタ Sobel_x = [-1 0 1; -2 0 2; -1 0 1]; %x方向 Sobel_y = [-1 -2 -1; 0 0 0; 1 2 1]; %y方向 %ノルム計算 Norm = zeros(size(GRAY,1),size(GRAY,2)); %ノルム格納配列 for i = 2:size(GRAY,1)-1 %行ループ for j = 2:size(GRAY,2)-1 %列ループ Localmat = [GRAY(i-1,j-1) GRAY(i,j-1) GRAY(i+1,j-1); GRAY(i-1,j) GRAY(i,j) GRAY(i+1,j); GRAY(i-1,j+1) GRAY(i,j+1) GRAY(i+1,j+1)]; %計算領域の輝度値 Norm(i,j) = norm([sum(sum(double(Localmat).*Sobel_x)),sum(sum(double(Localmat).*Sobel_y))]); %ノルム計算,格納 end end clear GRAY i j Sobel_x Sobel_y Localmat; %メモリ解放 %結果出力 Ave = mean(mean(Norm)); %ノルム平均値 Norm(Norm>=Ave) = 255; %平均値以上 Norm(Norm~=255) = 0; %平均値未満 Norm = uint8(Norm); %配列の型変換 imshow(Norm); clear;
実行結果
ということで作ったプログラムを実行してみるとこんな感じでした!
いい感じ!
最後に
プログラミングって程よく暇つぶし(頭働かせるし楽しい!)になるので大学の講義課題が全てプログラミングになればいいのに…
コメント