Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

複素関数を視覚化する

複素関数を視覚化します。
複素数 z=a+bi を用いた複素関数 f(z)において、実部 a、虚部 b に対して偏角 arg z および 絶対値 |r| が決まります。これら4つのパラメータを図示するために実部 a をx軸、虚部 b をy軸とした2次元グラフに、偏角 arg z を対応する色相、絶対値 |r| を対応する明度もしくは彩度でプロットする方法があります。
ここでは絶対値については図示せず偏角を色相表示します。色相はopencvHSV色空間の色相Hを用い、一周分の偏角に色相0~179を対応させます。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • opencv 4.0.0
(1) f = z の場合

複素関数 f = z では色相環そのものの角度分布を示します。
aおよびbの範囲は-2.5~2.5としています。

コード
import cmath
import math
import cv2
import numpy as np

width = 500
height = 500
img = np.zeros((height, width, 3), np.uint8)

for y in range(width):
    for x in range(height):
        a = (x-250)/100  # 実部。-2.5~2.5の範囲
        b = (y-250)/100  # 虚部。-2.5~2.5の範囲
        z = complex(a, b)
        f = (z) # 複素関数
        size, angle = cmath.polar(f)  # 複素関数の大きさ、偏角を取得                
        h = int(math.degrees(angle+math.pi)/2)  #偏角を色相hに変換      
        color_hsv = np.uint8([[[h ,255, 255]]]) # 求めた色相からhsvカラーを設定(彩度、明度は255)       
        color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR) #hsv→bgr変換
        b = int(color_bgr[0][0][0])  # bの輝度
        g = int(color_bgr[0][0][1])  # gの輝度
        r = int(color_bgr[0][0][2])  # rの輝度
        img[y, x] = [b, g ,r]  #img[y, x]のピクセルを求めたbgrカラーで置き換える
        
cv2.imwrite('complex.png', img)
実行結果

f:id:T_A_T:20200716221544p:plain

(2) f = z**2 (zの2乗)の場合

複素関数 f = z**2 では色相環の角度の回転が倍になります。
aおよびbの範囲は-2.5~2.5としています。

コード
import cmath
import math
import cv2
import numpy as np

width = 500
height = 500
img = np.zeros((height, width, 3), np.uint8)

for y in range(width):
    for x in range(height):
        a = (x-250)/100  # 実部。-2.5~2.5の範囲
        b = (y-250)/100  # 虚部。-2.5~2.5の範囲
        z = complex(a, b)
        f = (z**2) # 複素関数
        size, angle = cmath.polar(f)  # 複素関数の大きさ、偏角を取得                
        h = int(math.degrees(angle+math.pi)/2)  #偏角を色相hに変換      
        color_hsv = np.uint8([[[h ,255, 255]]]) # 求めた色相からhsvカラーを設定(彩度、明度は255)       
        color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR) #hsv→bgr変換
        b = int(color_bgr[0][0][0])  # bの輝度
        g = int(color_bgr[0][0][1])  # gの輝度
        r = int(color_bgr[0][0][2])  # rの輝度
        img[y, x] = [b, g ,r]  #img[y, x]のピクセルを求めたbgrカラーで置き換える
        
cv2.imwrite('complex2.png', img)
実行結果

f:id:T_A_T:20200716222028p:plain

(3) f = sin(z) の場合

aおよびbの範囲は-2.5~2.5としています。

コード
import cmath
import math
import cv2
import numpy as np

width = 500
height = 500
img = np.zeros((height, width, 3), np.uint8)

for y in range(width):
    for x in range(height):
        a = (x-250)/100  # 実部。-2.5~2.5の範囲
        b = (y-250)/100  # 虚部。-2.5~2.5の範囲
        z = complex(a, b)
        f = (cmath.sin(z)) # 複素関数
        size, angle = cmath.polar(f)  # 複素関数の大きさ、偏角を取得                
        h = int(math.degrees(angle+math.pi)/2)  #偏角を色相hに変換      
        color_hsv = np.uint8([[[h ,255, 255]]]) # 求めた色相からhsvカラーを設定(彩度、明度は255)       
        color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR) #hsv→bgr変換
        b = int(color_bgr[0][0][0])  # bの輝度
        g = int(color_bgr[0][0][1])  # gの輝度
        r = int(color_bgr[0][0][2])  # rの輝度
        img[y, x] = [b, g ,r]  #img[y, x]のピクセルを求めたbgrカラーで置き換える
        
cv2.imwrite('complex3.png', img)
実行結果

f:id:T_A_T:20200716222413p:plain

以下のサイトを参考にさせていただきました

色相と複素関数
定義域の着色『ウィキペディア(Wikipedia)』

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村