等角写像による画像の変換〜Schwarz-Christoffel 変換〜 part1

等角写像の一つであるSchwarz Christoffel 変換を用いて,画像の変換をしてみます. python によるコードも記載しております. 画像はhttps://uk.mathworks.com/help/images/examples/exploring-a-conformal-mapping_ja_JP.html より.

目次

今回の記事は,複素関数論の分野での目玉の一つ,「等角写像」に関してです.

読んで字のごとく,「角度を保存する」と書いてありますが,具体的にどのように角度が保存されているのか,記事を読んでみるとわかると思います.

画像処理という意味合いよりかは,画像の変換なので「お遊び」のようなイメージを持たれるかもしれません.

しかし,等角写像は曲面の微分幾何の分野などでも応用がなされており,例えば,脳皮質がどの程度類似しているか,などの情報を求めるのに使われたりします[1].

今回は,単に画像がどのように変換されるか,というのをpython を用いて試して見ようと思います.

等角写像とは

等角写像の意味

等角写像 とは,角度を保つ写像のことです.複素関数論の分野で頻繁に議論されます. ここでは,数学の理論から詳しく説明したいと思います.

等角写像となる写像は,複素数に基づく関数$f(z):=u(x,y) + i v(x,y)$に関して, Cauchy-Riemann の関係式

\begin{align} \frac{\partial u}{\partial x} = \frac{\partial v}{\partial v} \end{align} \begin{align} \frac{\partial u}{\partial y} = -\frac{\partial v}{\partial x} \end{align}

を満たすことが知られています.これを確認して見ましょう.

\begin{align} w = f(z) \end{align}

という写像を考えます.両辺の微少変位をとります.

\begin{align} dw = \frac{df}{dz} dz + \frac{df}{d\bar{z}} d\bar{z} \end{align}

ここで,$\frac{df}{dz} = r \exp{i\theta}$とします.このとき$dw = r\exp{i\theta} dz$ですので,これを図示してみると

図を見てわかる通り,写像前と後とで,角度が保たれていることが分かります. これが等角写像です.

簡単な等角写像の確認

上で述べた通り,写像が$w = f(z)$と,複素数$z$のみの関数として表されている場合に等角写像になりました.簡単な写像を用いて,これを確認して見ましょう.

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
1.py
まず,格子点を設定します.
## 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)
2.py

$w = \sin z$の写像

## 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)

3.py

$w = z^2$

## 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)
5.py

$w = (z-i)/(z+i)$

## conformal mapping g(z) = (z -i)/(z+i )

def h(z):
    return (z - 1j)/(z + 1j)

for x_i in x_m:
    z_h = x_i*np.ones(m) + y*1j
    plt.plot(np.real(h(z_h)),np.imag(h(z_h)),color='black')
for y_i in y_m:
    z_v = x+y_i*np.ones(m)*1j
    plt.plot(np.real(h(z_v)),np.imag(h(z_v)),color='black', linestyle='dashed')    

plt.gca().set_aspect('equal', adjustable='box')

sc = 1.1/s
plt.xlim(-s*sc,s*sc)
plt.ylim(-s*sc,s*sc)
4.py

実はこの写像は半平面Im$z > 0$を単位円に写します.

いずれの場合も

破線と実線とが直交するように変換されていることに注目です!

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$角形に写される.


直感的な理解は,実軸上の点$a_l$を実軸に沿って通過するとき,$(z-a_l)$の符号が変わる,つまり$\pi$だけ角度が変わることを用います.このとき$(z-a_l)^{\alpha_l - 1}$の項により $\pi(\alpha_l - 1)$だけ角度が変化することを考えれば,納得がいくかと思います.

これを用いると,半平面から長方形の写像は,以下のように楕円積分を用いた式によって与えられます.詳細は[2]の文献でご確認ください.

\begin{align} w = \int_{0}^z \frac{1}{\sqrt{(1-k^2z’^2)(1-z’^2)}} dz’ \end{align}

これが出来たら,以下のような流れで画像から円への写像が完成します.

  1. 画像から半平面への写像を計算
  2. 半平面から円への計算

まとめ

今回は,等角写像について説明を行い,簡単な等角写像を実装してみました.また,長方形から円へと等角に写すSchwarz-Christoffel 写像の紹介を行いました.

次回は実際にこれを実装してみます.

参考文献

[1] Genus Zero Surface Conformal Mapping and Its Application to Brain Surface Mapping,

Xianfeng Gu, Yalin Wang, Tony F. Chan, Paul M. Thompson, Shing-Tung Yau

[2] Complex Variables

Mark J. Ablowitz, University of Colorado, Boulder , Athanassios S. Fokas, Imperial College of Science, Technology and Medicine, London