|
・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を使用して画像を表示する方法はこちらで説明。

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