OpenCVというライブラリは画像加工に広く使われているPythonのライブラリになります。
色々触りながら学習していこうと思います。
まずは手始めに斜めに写した物体の画像を真正面から写したかのように変形させます 笑
よく画像スキャンアプリで斜めから撮った画像が綺麗にまっすぐに変形するのを見たことがあると思います。
それをやりたかったのです。
画像は斜めに撮影したナンバープレートを題材にしたいと思います。
乗り物ニュースというサイトさんの「アルファベット入りナンバープレート」増加中 どんな意味がある?」という記事から画像をお借りしました。
事前にlicenseplate.jpgという名前で画像をダウンロードしてきています。
画像の台形変形を試す
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/Users/hinomaruc/Downloads/licenseplate.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 画像の高さと幅を取得する
height, width = img.shape[:2]
# オブジェクトの四隅のポイントを定義
input_pts = np.float32([[71, 95], [420,45], [160, 311], [505,245]])
# アウトプットは元画像と同じサイズ
output_pts = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
# getPerspectiveTransformの行列の取得
matrix = cv2.getPerspectiveTransform(input_pts, output_pts)
# 変換の適用
result = cv2.warpPerspective(img, matrix, (width, height))
# BGRからRGBへの変換
result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
# 加工前と加工後の画像の確認
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title('Original')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(result_rgb)
plt.title('Transformed')
plt.axis('off')
plt.show()
Out[0]
input_ptsできちんとナンバープレートの四隅の位置を指定してあげることが大事でした。(ちょっとはまりました。)
美しいですね。画像分析するときの前処理などで使えそうですね。