OpenCV-Python開発ガイド(12)---幾何学的変換のアフィン

アフィン

OpenCVでは、アフィン変換とは、平行移動、回転、およびその他の操作を実現するための一連の幾何学的変換を指します。この変換により、画像の真直度と平行度を維持できます。真直度とは、画像がアフィン変換された後も直線が直線であることを意味します。平行度とは、画像がアフィン変換が完了した後も平行であることを意味します。

OpenCVでは、それが提供するアフィン関数はcv2.warpAffine()であり、これは変換行列Mによって実装されます。行列演算についてよく知らない場合は、後で説明する内容を覚えているか、離散を学ぶことができます。数学または線形代数。、両方とも行列演算を説明しています。

アフィン関数の定義は次のとおりです。

def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):

src:アフィンになる元の画像を表します

M:2 * 3変換行列を表します。さまざまな変換行列を使用して、さまざまなアフィン変換を実現できます。

dszie:出力画像のサイズを表します。

dst:アフィン後の出力画像を表します

フラグ:補間方法を表します。デフォルトはINTER_LINEARです。値がWARP_INVERSE_MAPの場合、Mが逆変換タイプであることを意味し、ターゲット画像dstから元の画像srcへの逆変換を実装します。詳細なパラメータ、前のブログ投稿表はです。

borderMode:エッジタイプを表します。デフォルトはBORDER_CONSTANTです。値がBORDER_TRANSPARENTの場合、ターゲット画像の値は変更されないことを意味し、これらの値は元の画像の異常値に対応します。

borderValue:境界線の値を表します。デフォルトは0です。

要約すると、一般的に使用されるパラメーターは、src、M、dsizeです。

パン

既知のアフィン式は次のとおりです。

アフィン式
ここで、画像を右に50ピクセル、下に100ピクセルシフトしたいとします。その場合、置換後の式は次のようになります。

dst(x、y)= src(x + 50、y + 100)

dst(x、y)= src(1 x、+ 0 y + 50,0 x + 1 y + 100)

Mの各要素の値を取得します。

M11 = 1

M12 = 0

M13 = 50

M21 = 0

M22 = 1

M23 = 100

要約すると、右に50ピクセルシフトし、100ピクセル下にシフトするための変換行列は次のとおりです。

M

変換行列と元の画像がわかれば、画像の変換操作を非常に簡単に完了できます。具体的なコードは次のとおりです。

import cv2
import numpy as np

img = cv2.imread("4.jpg")
h, w = img.shape[:2]
x = 50
y = 100
M = np.float32([[1, 0, x], [0, 1, y]])
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()

実行後の効果は次のとおりです。
画像

スピン

関数cv2.warpAffine()を使用して画像を回転させる場合、変換行列は関数cv2.getRotationMatrix2D()を介して取得できます。この関数の構文形式は次のとおりです。

def getRotationMatrix2D(center、angle、scale):

中心:回転の中心です

角度:回転角。正の数は反時計回りの回転を意味し、負の数は時計回りの回転を意味します。

scale:は変換サイズ(つまり、上記のズームサイズ)です。

次に、上の画像を45度回転させてみましょう。具体的なコードは、次のとおりです。

import cv2

img = cv2.imread("4.jpg")
h, w = img.shape[:2]
M = cv2.getRotationMatrix2D((w / 2, h / 2), 45, 0.6)
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()

M変換行列を変更するだけです。ここで、(w / 2、h / 2)は画像の中心座標、45は正の数、つまり反時計回りに45度回転し、0.6は画像を0.6倍ズームします。

実行後の効果は次のとおりです。
画像

おすすめ

転載: blog.csdn.net/liyuanjinglyj/article/details/113802561