画像処理では、画像内のある領域に対して加工をする処理が最も頻繁に実施されています。ここではその基礎となる興味領域(ROI)の抽出と元画像への再マップ方法を習得します。
こんにちは。wat(@watlablog)です。
ここでは画像処理の基礎の基礎、ROI抽出について学びます。
ROI抽出を使えば効率的な画像処理ができる
ROI抽出とは?
ROIとは、Region of Interestの略で、日本語では関心領域や対象領域、興味領域と呼ばれています。
日本語の意味の通りで、関心のある領域、つまりこれから処理をしようとしている部分のことを指します。
以下はROIの説明図です。例えば、人の顔の画像を使って、目の動きをトラッキング(追跡)したい場合等は、目の特徴量を抽出して画像処理を行う必要があります。
上記目的の場合は目の情報さえあれば良いので、領域としては目の周りだけあれば十分です。この時、下の画像のような四角い領域で示した領域のことをROI、これを抽出することをROI抽出と呼びます。
ROI抽出を使うメリットは?
上の画像で示した目の情報を計算する処理の場合、画像のサイズが膨大、または大きな画像の中に複数の人の顔がある場合は、1枚の画像の中で全処理を毎回行っていては計算コストが増大してしまい、思ったようなパフォーマンスが得られません。
そのため、一般にはROIで抽出した部分だけに対して技術的な計算を行うことで、処理を軽くすることを考えます。ROI抽出はパフォーマンスを良くするメリットがあります。
Python/OpenCVでROI抽出するコード
画像処理の分野は百聞は一見にしかず、と言わずにはいられません。以下にコードを示しつつ説明をしていきます。
画像読み込み
「Python/OpenCVで画像の二値化をする方法」で行った時と同様に、以下のコードで画像を読み込みます。
1 2 3 4 5 |
import cv2 from matplotlib import pyplot as plt path = 'srime.jpg' # 画像のパス i = cv2.imread(path, 1) # 画像読み込み |
cv2.imreadの第2引数は1を指定してカラー画像にしています。
今回題材とするのは以下の画像です。今回あえてわかりやすさのために、軸を付けています。
「スライム が あらわれた !」的な。
ROIの範囲を指定して抽出する
ROI抽出の方法はいたって簡単で、以下の文で画像の範囲を指定して別の変数に格納するだけです。
1 |
obj = i[65:225, 15:200] #ROI抽出 |
但し、数値の指定の仕方が少し特殊で、初心者が迷いそうだったので、以下に図解してみました。
画像の始点と終点を四角形を描くように決定し、座標値を使う所まではイメージ通りと思いますが、抽出時は[縦の範囲, 横の範囲]という書き方をする必要があります。
普通に\(x, y\)の順だと思ってたけど違った!
ROI画像を元画像にコピー&ペースト
今回はROIだけを説明するため、特に特殊な画像処理はしません。単純に元画像の指定の範囲に抽出した画像を貼り付けてみます。
貼り付けるだけのコードは以下です。数値の指定の仕方は上のROI抽出時と同じです。
1 |
i[65:225, 185:370] = obj # ROI画像を元画像の異なる位置にペースト |
この処理の段階で以下の画像になります。objに対して事前に色々な処理をしてから貼り付けても面白いかも知れません。
「スライム が なかま を よんだ !」的な。
グラフ表示までを含む全コード
以下に今回のプログラム全コードを示します。1つ注意点としては、僕は便利なので画像表示をmatplotlibで行っていますが、OpenCVの色の並び順がBGR(青→緑→赤)なのに対し、matplotlibはRGB(赤→緑→青)です。
そのためcv2.cvtColor関数で色変換をしています。そのまま表示させるとスライムベスになってしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import cv2 from matplotlib import pyplot as plt path = 'srime.jpg' # 画像のパス i = cv2.imread(path, 1) # 画像読み込み obj = i[65:225, 15:200] # ROI抽出 i[65:225, 185:370] = obj # ROI画像を元画像の異なる位置にペースト # matplotlibの表示に合わせてRGBの順番に色を並び替える。 i = cv2.cvtColor(i, cv2.COLOR_BGR2RGB) # ここからグラフ設定 # フォントの種類とサイズを設定する。 plt.rcParams['font.size'] = 14 plt.rcParams['font.family'] = 'Times New Roman' fig = plt.figure() ax1 = fig.add_subplot(111) # 画像をプロット ax1.imshow(i) # 軸のラベルを設定する。 ax1.set_xlabel('x [pix]') ax1.set_ylabel('y [pix]') fig.tight_layout() plt.show() plt.close() |
まとめ
今回は画像処理の基本であるROI抽出を取り扱いました。
ROIは複雑な検出処理を行う場合に計算コストを抑える効果があります。ROIの範囲指定には縦→横の範囲の順に指定する所がポイントです。
今回は結構乱暴なコピペだったけど、これが画像の画素へ範囲でアクセスする基本。基礎が大事なのでじっくり習得しよう!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
他のサイトよりも分かりやすかったです.
ありがとうございました.