OpenCV で画像を回転

Ammar Ali 2023年1月30日
  1. Python で OpenCV の rotate() 関数を使用して画像を回転させる
  2. Python で OpenCV の warpAffine() 関数を使用して画像を回転させる
OpenCV で画像を回転

このチュートリアルでは、Python で OpenCV の rotate() および warpAffine() 関数を使用して画像を回転させる方法について説明します。

Python で OpenCV の rotate() 関数を使用して画像を回転させる

OpenCV の rotate() 関数を使用して画像を回転させることができます。rotate() 関数の最初の引数は、回転させたい画像です。2 番目の引数は、画像が回転する量と方向を指定します。

rotate() 関数を使用して画像を回転させる方法は 3つだけです。2 番目の引数を cv2.ROTATE_90_CLOKWISE に設定して、画像を時計回りに 90 度回転させることができます。

cv2.ROTATE_180 を使用して、画像を 180 度回転したり、反転したりできます。cv2.ROTATE_90_COUNTERCLOCKWISE を使用して、画像を反時計回りに 90 度または時計回りに 270 度回転させることができます。これらは、rotate() 関数を使用して画像を回転させるための唯一の 3つの角度です。

たとえば、imread() 関数を使用して画像を読み取り、時計回りに 90 度回転してから、imshow() 関数を使用して元の画像と一緒に表示してみましょう。以下のコードを参照してください。

import cv2
import numpy as np

image = cv2.imread("cat.jpg")
image_norm = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)

cv2.imshow("original Image", image)
cv2.imshow("Rotated Image", image_norm)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

画像を回転させる

rotate() を使用すると、画像を 3つの角度でしか回転できませんが、画像をすべての角度で回転させたい場合は、以下で説明する warpAffine() 関数を使用できます。

Python で OpenCV の warpAffine() 関数を使用して画像を回転させる

OpenCV の warpAffine() 関数を使用して、画像を任意の角度で回転させることができます。warpAffine() 関数は、行列を別の行列に変換します。

画像を回転させるには、OpenCV の getRotationMatrix2D() 関数を使用してその回転行列を見つける必要があります。

getRotationMatrix2D() の最初の引数は、画像を回転させたい画像の中心です。2 番目の引数は回転角で、3 番目の引数は画像の縮尺です。

縮尺が 1 未満の場合、画像は元の画像よりもサイズが小さくなります。つまり、ズームアウトされます。スケールが正の数の場合、画像はスケールまたはズームインされます。縮尺が 1 の場合、画像は縮尺されません。

warpAffine() 関数の最初の引数は、回転させたい画像です。2 番目の引数は回転行列で、3 番目の引数は出力画像のサイズです。

たとえば、上の画像を中心を中心に 45 度回転させてみましょう。以下のコードを参照してください。

import cv2
import numpy as np

image = cv2.imread("cat.jpg")

(h, w) = image.shape[:2]
center = (w / 2, h / 2)
angle = 30
scale = 1

M = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(image, M, (w, h))

cv2.imshow("original Image", image)
cv2.imshow("Rotated Image", rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

WarpAffine で画像を回転させる

上記のコードでは、shape メソッドを使用して指定された画像の長さと幅を見つけ、次に長さと幅の半分を使用して画像の中心を計算しました。中心、角度、スケールの値を変更して、目的の結果を得ることができます。

borderMode 引数を使用して、出力画像の境界モードを設定することもできます。デフォルトでは、境界線モードは cv2.BORDER_CONSTANT に設定されており、ご覧のとおり、出力画像の隅に境界線はありません。

ボーダーモードを cv2.BORDER_TRANSPARENT に設定できます。出力画像の境界線は元の画像と同じになるか、コーナーは同じままになります。

ボーダーモードを cv2.BORDER_REPLICATE に設定できます。出力画像の境界線またはコーナーは、近くのピクセルを使用して描画されます。

ボーダーモードの詳細については、このリンクをクリックしてください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Python OpenCV

関連記事 - OpenCV Image