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