質問: MATLABで文字認識の勉強をしています。 CNNを用いて文字認識を行っていますが、画像の正規化について悩んでいます。 全ての文字画像の文字のアスペクト比は変えずに、画像サイズを統一したいです。 例えば50×150サイズの文字画像を30×30サイズにするとして、文字のアスペクト比はそのままにして30×30にしたいです。 そこでまず50×150の画像を10×30に縮小し、この画像の両サイドに10×30の余白を追加して30×30の画像を作ります。 このような処理をすべての画像に対し行い、文字のアスペクト比を変えずに画像サイズを統一したいと考えています。 このような処理をしたいのですが余白を追加する方法がわかりません。わかる方回答をお願いします。
回答: 単純ですが、サイズ拡張後の画像サイズ分の白画像を用意し、希望の位置に元画像の画素値を割り当てるのはいかがでしょうか。 ``` % 縮小済み画像の読み込み src_img = imread('lena_gray.png'); imshow(src_img) % 拡張後のサイズ dst_siz_x = 300; dst_siz_y = 500; % 縮小後に画像を配置する位置を計算 src_siz = size(src_img); s_pos_x = floor((dst_siz_x - src_siz(1)) / 2); s_pos_y = floor((dst_siz_y - src_siz(2)) / 2); e_pos_x = s_pos_x + src_siz(1) - 1; e_pos_y = s_pos_y + src_siz(2) - 1; % 拡張画像の初期化 dst_img = ones(dst_siz_x, dst_siz_y, 'uint8') * 255; % 画素割り当て dst_img(s_pos_x:e_pos_x, s_pos_y:e_pos_y) = src_img; figure imshow(dst_img) ``` ただし上記のコードは、以下の仮定のもとでざっくり組んだものです。 * 元画像は0 - 255のグレースケール * 必ず拡張の方向(src_siz < dst_siz) * 余白は画像の周りに配置