Loading [MathJax]/jax/output/CommonHTML/jax.js
2018年11月14日 更新

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

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

7,686 view お気に入り 0

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

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

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

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

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

等角写像とは

等角写像の意味

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

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

ux=vv uy=vx

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

w=f(z)

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

dw=dfdzdz+dfdˉzdˉz

ここで,dfdz=rexpiθとします.このときdw=rexpiθdzですので,これを図示してみると

 (5035)

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

簡単な等角写像の確認

上で述べた通り,写像が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
 (5020)

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)

3.py
 (5023)

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

関連する記事 こんな記事も人気です♪

量子アニーリングを駆使して数独を解いてみた

量子アニーリングを駆使して数独を解いてみた

先日,量子アニーリングの勉強会に参加して来ました.そのアウトプットとして,今回,数独ソルバーを作ってみます.
井上 大輝 | 4,307 view
Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

画像処理の一つ,モルフォロジー変換をPython と OpenCVのライブラリを用いて実装し,それを2値画像に対して適用します.
等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

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

前回の記事「等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 1」の続きです. 実際に実装をして,写像を確かめてみます.
画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -

画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -

画像処理のセグメンテーションの分野で用いられるLevel set 法を用いて画像のセグメンテーションを行います.
点像分布関数の話

点像分布関数の話

光学系を理解するうえで前提として知っておいた方が良い内容
Yoshiyuki Arai | 4,506 view

この記事のキーワード

この記事のキュレーター

エルピクセル編集部 エルピクセル編集部