今回の記事は,前回の記事の続きになります. 前回の記事は下のリンクからご確認ください.
等角写像による画像の変換〜Schwarz-Christoffel 変換〜 part1 - IMACEL Academy -人工知能・画像解析の技術応用に向けて-|LPixel(エルピクセル)
等角写像の一つであるSchwarz Christoffel 変換を用いて,画像の変換をしてみます.python によるコードも記載しております.画像はhttps://uk.mathworks.com/help/images/examples/exploring-a-conformal-mapping_ja_JP.htmlより.
1. Schwarz- Christoffel 変換
Schwarz - Christoffel 変換とは,半平面を等角写像に基づいて三角形,四角形などの多角形に変換する写像です.具体的な変換式は以下のようになります.
Schwarz-Christoffel 変換
$w$平面上の多角形に関して,その各頂点の内角を順番に $\alpha_1 \pi, \alpha_2 \pi,\cdots, \alpha_n \pi$とするとき
\begin{align}
\frac{dw}{dz} = \gamma(z-a_1)^{\alpha_1 - 1}(z-a_2)^{\alpha_2 - 1} \cdots
(z-a_n)^{\alpha_n - 1}
\end{align}
によって,半平面から$n$角形に写される.
今回の場合,四角形に写すことを考えていますので,$\alpha_1 = \alpha_2 = \alpha_3 = \alpha_4 = 1/2$を代入し,さらに$a_1=-1/k, a_2 =-1, a_3 = 1, a_4 = 1/k$とすると, \begin{align} \frac{dw}{dz} =\frac{\tilde{\gamma}}{\sqrt{(1-z^2)(1-k^2z^2)}} \end{align}
となります.これは,ヤコビの楕円関数と深く関係しています.詳しくは以下のページをご覧ください.
2. 今回のフローチャート
今回は,正方形から円への写像を実装します.具体的には,
- Schwartz- Christoffel の逆変換により,正方形を半平面に
- 半平面を円に
の方法によって行います.
3. 実装
それでは実装をしていきます.まずは,以下のように格子点を定義しておきます.
import matplotlib import matplotlib.pyplot as plt import numpy as np import scipy as sp import scipy.special
パッケージのインストール.py
# Schwarz Christoffel Mapping ## square s = 1 m = 1000 x_m = np.linspace(-s,s,m/50) x = np.linspace(-s,s,m) for x_i in x_m: plt.plot(x_i*np.ones(m),x,color='black') plt.plot(x,x_i*np.ones(m),color='black', linestyle='dashed') plt.gca().set_aspect('equal', adjustable='box') sc = 1.2 plt.xlim(-s*sc,s*sc) plt.ylim(-s*sc,s*sc) plt.show()
格子点定義.py
次に,必要となる楕円関数などを定義します.python のscipy の関数は引数として複素数値を受け入れないので,級数を用いて定義し直します.