【Matlab】Laplacianフィルターとゼロ交差【画像処理】

スポンサーリンク
laplacian_01 画像処理
スポンサーリンク

はじめに

大学の講義課題です。

Laplacianフィルターを通してゼロ交差画素をエッジとせよ。という課題です。

今日も不眠症が続いて先ほど起きてしまって暇なので、さくっと実装してみました。

ソースコード

Laplacianフィルターを通すところまでは前回のSobelフィルターと同様です。

最後にゼロ交差判定を行い出力用の配列に保存すれば完成です!

ゼロ交差についてはコメントアウトに書いた通りの3つの条件のいずれかを満たしている場合にゼロ交差画素としてエッジ検出しました。

%画像の読み込み
URL = 'img/test.jpg'; %相対パス
RGB = imread(URL); %画像の読み込み
GRAY = rgb2gray(RGB); %グレースケール化

clear URL RGB; %メモリ解放

%Laplacianフィルタ
Laplacian = [0 1 0; 1 -4 1; 0 1 0];

%Laplacianフィルタ計算
Calc = 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)]; %計算領域の輝度値
        Calc(i,j) = sum(sum(double(Localmat).*Laplacian)); %計算,格納
    end
end

imshow(Calc);

clear GRAY i j Laplacian Localmat; %メモリ解放

%ゼロ交差判定
Edge = uint8(zeros(size(Calc,1),size(Calc,2))); %出力用配列

for i = 2:size(Calc,1)-1 %行ループ
    for j = 2:size(Calc,2)-1 %列ループ
        Localmat = [Calc(i-1,j-1) Calc(i,j-1) Calc(i+1,j-1) Calc(i-1,j) Calc(i+1,j) Calc(i-1,j+1) Calc(i,j+1) Calc(i+1,j+1)]; %計算領域の数値
        
        %条件判定
        if Calc(i,j) > 0 && size(Localmat(Localmat < 0),2) %注目画素>0 かつ 近傍画素<0
            Edge(i,j) = 255;
        elseif Calc(i,j) < 0 && size(Localmat(Localmat > 0),2) %注目画素<0 かつ 近傍画素 >0
            Edge(i,j) = 255;
        elseif Calc(i,j) == 0 && size(Localmat(Localmat ~= 0),2) %注目画素==0 かつ 近傍画素 ~=0
            Edge(i,j) = 255;
        end
    end
end

%clear Calc i j Localmat; %メモリ解放
figure;
imshow(Edge);

実行結果

途中でなんとなくLaplacianフィルターを掛けたものを出力しているので2つの画像が出力されます。

laplacian_01
Laplacianフィルターを掛けたもの
laplacian_02
出力結果

凄く薄いですが、単体で使うとこんなもんです。

もっとぼやけた画像だったりするとエッジがいい感じに出力されるのですが、生憎いい感じの画像を見つけることができませんでした。

最後に

この回の出席確認ついでのコメントシートを開始10分で提出したら真面目にやってないよね?これからは真面目に取り組むようにと教授からメッセージが来ました。

配られた資料は全て読みましたし、数式などは全て把握済みだったので、真面目にやってその速度で提出したのですがなんかやるせない気持ちになりました。

オンライン授業の弊害ですかね。提出できるのにしないでのんびりしてるのはもったいないですし。

コメント

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