![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
OpenCVは2つの変換関数 cv.warpAffine と cv.warpPerspective を提供しており、これらであらゆる種類の変換を行える。cv.warpAffine は2x3の変換行列を入力に取り、一方 cv.warpPerspective は3x3の変換行列を入力に取る。
拡大縮小は画像のリサイズにほかならない。OpenCVにはこの目的のための関数 cv.resize() がある。画像のサイズは手動で指定することも、拡大縮小率を指定することもできる。さまざまな補間手法が使われる。推奨される補間手法は、縮小には cv.INTER_AREA、拡大には cv.INTER_CUBIC(低速)および cv.INTER_LINEAR である。デフォルトでは、すべてのリサイズ用途に補間手法 cv.INTER_LINEAR が使われる。入力画像は次のいずれかの方法でリサイズできる:
平行移動とは物体の位置をずらすことである。(x,y)方向のずれが分かっており、それを \((t_x,t_y)\) とすると、次のように変換行列 \(\textbf{M}\) を作成できる:
\[M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \end{bmatrix}\]
これを型np.float32のNumpy配列にして、cv.warpAffine() 関数に渡せばよい。(100,50)のずれの例を以下に示す:
警告
cv.warpAffine() 関数の第3引数は出力画像のサイズで、(width, height) の形式である必要がある。width = 列数、height = 行数であることに注意。
以下の結果を参照のこと。
角度 \(\theta\) での画像の回転は、次の形式の変換行列によって実現される
\[M = \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\]
しかしOpenCVは回転中心を調整できるスケール付き回転を提供しており、好きな位置で回転できる。修正された変換行列は次で与えられる
\[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot center.x - \beta \cdot center.y \\ - \beta & \alpha & \beta \cdot center.x + (1- \alpha ) \cdot center.y \end{bmatrix}\]
ここで:
\[\begin{array}{l} \alpha = scale \cdot \cos \theta , \\ \beta = scale \cdot \sin \theta \end{array}\]
この変換行列を求めるために、OpenCVは関数 cv.getRotationMatrix2D を提供している。スケーリングなしで中心を基準に画像を90度回転する以下の例を確認してほしい。
結果を見てみる:
アフィン変換では、元の画像内のすべての平行線は出力画像内でも平行のままである。変換行列を求めるには、入力画像から3点と、それらに対応する出力画像内の位置が必要である。すると cv.getAffineTransform が2x3の行列を作成し、それを cv.warpAffine に渡す。
以下の例を確認し、私が選んだ点(緑色でマークされている)も見てほしい:
結果を見てみる:
透視変換には3x3の変換行列が必要である。直線は変換後も直線のままである。この変換行列を求めるには、入力画像上の4点と出力画像上の対応する点が必要である。これら4点のうち、3点は同一直線上にあってはならない。すると変換行列は関数 cv.getPerspectiveTransform で求められる。次に、この3x3の変換行列を用いて cv.warpPerspective を適用する。
以下のコードを見てほしい:
結果: