Pynote

Python、機械学習、画像処理について

OpenCV - 画像を回転、反転させる方法について

任意の角度回転させる。

画像を任意の角度だけ回転させるには、まず getRotationMatrix2D() で回転行列を作成する。

retval = cv2.getRotationMatrix2D(center, angle, scale)

引数 center には回転させる中心座標 (x, y)、引数 angle には反時計回りの回転角度を指定する。
引数 scale は回転後に画像をスケーリングする場合はその係数を指定する。scale=1.0 の場合は元の画像と同じ大きさになる。
getRotationMatrix2D() は指定したパラメータによる変換を行う形状が (2, 3) のアフィン変換行列を返す。

次のこのアフィン変換行列を warpAffine で画像に適用する。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("butterfly.jpg")

# 反時計回りに画像の中心回りに120度回転するアフィン変換行列を作成する。
h, w = img.shape[:2]  # 画像の大きさ
M = cv2.getRotationMatrix2D(center=(w / 2, h / 2), angle=60.0, scale=0.5)
print(M)
# [[  0.25         0.4330127  107.79873906]
#  [ -0.4330127    0.25       240.23763102]]

# 画像にアフィン変換行列を適用する。
dst = cv2.warpAffine(img, M, dsize=(w, h))

cv2.imwrite("result.png", dst)


画像を 90°、180°、270° 回転させる

rotate() で画像を90度、180度、270度回転できる。

dst = cv2.rotate(src, rotateCode[, dst])

  • 引数
    • src: 入力画像
    • rotateCode:
      • cv2.ROTATE_90_CLOCKWISE: 反時計回りに270° (時計回りに90°) 回転する。
      • cv2.ROTATE_180: 反時計回りに180° (時計回りに180°) 回転する。
      • cv2.ROTATE_90_COUNTERCLOCKWISE: 反時計回りに90° (時計回りに270°) 回転する。
  • 返り値
    • dst: 出力画像

反時計回りに90° (時計回りに270°) 回転させる。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.png")

# 反時計回りに90° (時計回りに270°) 回転させる。
dst = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)

plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.title("rotate 90 degree in ccw")
plt.show()


反時計回りに180° (時計回りに180°) 回転させる。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.png")

# 反時計回りに180° (時計回りに180°) 回転させる。
dst = cv2.rotate(img, cv2.ROTATE_180)

plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.title("rotate 180 degree in ccw")
plt.show()


反時計回りに270° (時計回りに90°) 回転する。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.png")

# 反時計回りに270° (時計回りに90°) 回転する。
dst = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.title("rotate 270 degree in ccw")
plt.show()


画像を反転する。

cv2.flip で画像を上下左右反転できる。

dst = cv2.flip(src, flipCode[, dst])

  • 引数
    • src: 入力画像
    • flipCode:
      • 0: 上下反転する。
      • 1: 左右反転する。
      • -1: 上下左右反転する。
  • 返り値
    • dst: 出力画像

上下反転する。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.png")

# 上下反転する。
dst = cv2.flip(img, 0)
plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.title("flip vertical")
plt.show()


左右反転する。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.png")

# 左右反転する。
dst = cv2.flip(img, 1)
plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.title("flip horizontal")
plt.show()


上下左右反転する。

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む。
img = cv2.imread("sample.png")

# 上下左右反転する。
dst = cv2.flip(img, -1)
plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.title("flip vertical and horizontal")
plt.show()