【Matlab】ROIによるグレースケール画像のテンプレートマッチング【画像処理】

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

はじめに

今回も大学講義の課題です。

テンプレートマッチングをグレースケール画像で行え。自分でラスタスキャンするべし。という課題です。

できるだろと思っていると、締め切り日まで暢気に構えてしまってダメですね。大変でした。

ソースコード

手順としては

  1. テンプレート画像を読み込んでグレースケール化。
  2. 以後、照合する画像分ループ処理
    1. 照合する画像を順番に読み込んでグレースケール化。
    2. ROIを計算。
    3. 最もROIの小さい画像のファイル名と座標を保存しておく。
  3. 結果の出力

という感じです。

tic; %タイマー開始

%テンプレート画像の読み込み
tmpURL = 'template_image.tiff'; %相対パス
tmpRGB = imread(tmpURL); %画像の読み込み
tmpGRAY = rgb2gray(tmpRGB); %グレースケール化

clear tmpURL tmpRGB; %メモリ解放

%照合画像の読み込み
LIST = dir('sampleimg/*.tiff'); %照合画像フォルダ内の画像リスト,LIST(数).nameでファイル名

%ROI,位置情報
MinROI = sum(sum(double(ones(size(tmpGRAY))).*255.^2)); %輝度値の最大が255として,ROIの最大値で初期化
MinIMG = 'none'; %ファイル名
MinI = -1; %行
MinJ = -1; %列

%照合
for img = 1:size(LIST,1) %画像分繰り返し
    
    tarNAME = LIST(img).name; %対象画像名
    tarRGB = imread(strcat('sampleimg/',tarNAME)); %対象画像の読み込み
    tarGRAY = rgb2gray(tarRGB); %対象画像グレースケール化
    
    clear tarRGB; %メモリ解放
    
    %比較
    for i = 1:size(tarGRAY,1)-size(tmpGRAY,1) %行ループ
        for j = 1:size(tarGRAY,2)-size(tmpGRAY,2) %列ループ
            
            tarROI = sum(sum((double(tarGRAY(i:i+size(tmpGRAY,1)-1,j:j+size(tmpGRAY,2)-1))-double(tmpGRAY)).^2)); %ROIの計算
            
            %各値の更新
            if tarROI < MinROI
                MinROI = tarROI; %ROI
                MinIMG = tarNAME; %ファイル名
                MinI = i; %行
                MinJ = j; %列
            end
            
            clear tarROI; %メモリ解放
        end
    end
    
    clear tarNAME tarGRAY i j; %メモリ解放
end

clear tmpGRAY LIST MinROI img; %メモリ解放

disp(MinIMG);
disp(MinI);
disp(MinJ);

clear MinIMG MinI MinJ; %メモリ解放

toc; %タイマー終了

終わりに

効率がいいプログラムになっているかは保証できないです。

画像サイズ「22*21」のテンプレート画像に対して「256*256」の画像15枚を照合させると手持ちのmacproでの処理時間は25秒程度でした。

コメント

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