はじめに
今回も大学講義の課題です。
テンプレートマッチングをグレースケール画像で行え。自分でラスタスキャンするべし。という課題です。
できるだろと思っていると、締め切り日まで暢気に構えてしまってダメですね。大変でした。
ソースコード
手順としては
- テンプレート画像を読み込んでグレースケール化。
- 以後、照合する画像分ループ処理
- 照合する画像を順番に読み込んでグレースケール化。
- ROIを計算。
- 最もROIの小さい画像のファイル名と座標を保存しておく。
- 結果の出力
という感じです。
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秒程度でした。
コメント