アフィン変換とは pythonによる実装例



ソフトウェア

公開日:2021/10/14          

In English
前提知識
python , tkinter
行列


■アフィン変換とは

アフィン変換とは、行列を用いて画像の拡大縮小/回転/平行移動/せん断を行う処理のことで、以下式で表します。



<拡大、縮小>
aとeに値を設定すると、その数値だけ拡大縮小されます。以下は2倍の例です。



<平行移動>
以下は2だけ移動する場合の例です。



<回転>
90度回転した場合を例にとると、計算が簡単で解りやすいと思います。



<反転>
X値が反転しています。


<せん断>
任意の面に平行方向の力が加わることをせん断といいます。この処理をスキュー(歪み)ともいいます。



■アフィン変換のpythonによる実装例

縮小と回転を同時に行うことも可能です。 アフィン変換の関数に、"Image.NEAREST"という部分がありますが、これは画像拡大時のデータ補間方法を定義しており、Nearest Neighborという手法を使っています。

import numpy as np
import tkinter as tk
from PIL import Image, ImageTk

app = tk.Tk()
img = Image.open('test.png')    # 画像ファイル情報取得。text.pngは任意に設定

affine = np.array([    # 縮小と回転
            [1, -0.5, 0],
            [0.5, 0.7, 0],
            [0, 0, 1]])

aff_inv = np.linalg.inv(affine)        # アフィン変換逆行列
aff_tuple = tuple(aff_inv.flatten())        # アフィン逆行列を一次元へ変換
img = img.transform((300,300),Image.AFFINE,aff_tuple,Image.NEAREST) # アフィン変換
tk_img = ImageTk.PhotoImage(img)

canvas = tk.Canvas(app, width=300, height=300)        # 画像表示エリアの作成
canvas.pack()
canvas.create_image(0, 0 , anchor = tk.NW, image=tk_img)        # 画像表示

app.mainloop()


<結果>
左が元の画像、右がアフィン変換後の画像です。うまく変換することができました。tkinterを使用して画像を表示する方法はこちらで説明。










サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



ソフトウェア