今回の記事は,複素関数論の分野での目玉の一つ,「等角写像」に関してです.
読んで字のごとく,「角度を保存する」と書いてありますが,具体的にどのように角度が保存されているのか,記事を読んでみるとわかると思います.
画像処理という意味合いよりかは,画像の変換なので「お遊び」のようなイメージを持たれるかもしれません.
しかし,等角写像は曲面の微分幾何の分野などでも応用がなされており,例えば,脳皮質がどの程度類似しているか,などの情報を求めるのに使われたりします[1].
今回は,単に画像がどのように変換されるか,というのをpython を用いて試して見ようと思います.
等角写像とは
等角写像の意味
等角写像 とは,角度を保つ写像のことです.複素関数論の分野で頻繁に議論されます. ここでは,数学の理論から詳しく説明したいと思います.
等角写像となる写像は,複素数に基づく関数f(z):=u(x,y)+iv(x,y)に関して, Cauchy-Riemann の関係式
∂u∂x=∂v∂v ∂u∂y=−∂v∂x
を満たすことが知られています.これを確認して見ましょう.
w=f(z)
という写像を考えます.両辺の微少変位をとります.
dw=dfdzdz+dfdˉzdˉz
ここで,dfdz=rexpiθとします.このときdw=rexpiθdzですので,これを図示してみると
図を見てわかる通り,写像前と後とで,角度が保たれていることが分かります. これが等角写像です.
簡単な等角写像の確認
上で述べた通り,写像がw=f(z)と,複素数zのみの関数として表されている場合に等角写像になりました.簡単な写像を用いて,これを確認して見ましょう.
import matplotlib import matplotlib.pyplot as plt import numpy as np
## upper half plane s = 3 m = 1000 x_m = np.linspace(-s,s,m/50) y_m = np.linspace(0,s,m/100) x = np.linspace(-s,s,m) y = np.linspace(0,s,m) for x_i in x_m: plt.plot(x_i*np.ones(m),y,color='black') for y_i in y_m: plt.plot(x,y_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)
w=sinzの写像
## conformal mapping f(z) = sin(z) def sin(z): return np.sin(z) for x_i in x_m: z_h = x_i*np.ones(m) + y*1j plt.plot(np.real(sin(z_h)),np.imag(sin(z_h)),color='black') for y_i in y_m: z_v = x+y_i*np.ones(m)*1j plt.plot(np.real(sin(z_v)),np.imag(sin(z_v)),color='black', linestyle='dashed') plt.gca().set_aspect('equal', adjustable='box') plt.xlim(-s*2,s*2) plt.ylim(-s*2,s*2)
w=z2
## conformal mapping f(z) = z^2 def z2(z): return z*z #return np.conj(z)*np.conj(z) for x_i in x_m: z_h = x_i*np.ones(m) + y*1j plt.plot(np.real(z2(z_h)),np.imag(z2(z_h)),color='black') for y_i in y_m: z_v = x+y_i*np.ones(m)*1j plt.plot(np.real(z2(z_v)),np.imag(z2(z_v)),color='black', linestyle='dashed') plt.gca().set_aspect('equal', adjustable='box') sc = 3.2 plt.xlim(-s*sc,s*sc) plt.ylim(-s*sc,s*sc)