-
Notifications
You must be signed in to change notification settings - Fork 0
/
refraction_idx.py
83 lines (66 loc) · 2.43 KB
/
refraction_idx.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 4 2021
@author: Kenta Kawaguchi
"""
import cv2
import numpy as np
#### Not Anaconda Library ####
import fdtd
class MeshNum:
"""
メッシュ数を保持します。
Attributes
----------
x : int
X方向のメッシュ数
y : int
Y方向のメッシュ数
z : int
Z方向のメッシュ数
"""
def __init__(self, x:int = 0, y:int = 0, z:int = 0):
self.x = x
self.y = y
self.z = z
class RefractionIdx:
"""
3次元の屈折率分布を保持します。
また、各種方法により屈折率分布を生成します。
Attributes
-----------
table : np.ndarray
屈折率の3次元テーブル
mesh_num : MeshNum
メッシュ数。屈折率のテーブルサイズに対応している。
"""
def __init__(self):
pass
def set_refraction_from_img(self, fpath:str, refraction_min:float, refration_max:float):
"""
2次元画像を読み込んで、GrayScaleに変換し輝度値255を最大屈折率、輝度値0を最小屈折率とする。
"""
img = cv2.imread(fpath, cv2.IMREAD_GRAYSCALE)
self.table = self.create_refraction_with_gradation(img, refraction_min, refration_max)
def create_refraction_with_gradation(self, img: np.ndarray, refraction_min:float, refraction_max:float) -> np.ndarray:
"""
2次元画像を読み込み、輝度値255を最大屈折率、輝度値0を最小屈折率とする3次元屈折率テーブルを返す。
"""
self.mesh_num = self.set_mesh_num_from_img(img)
table = self.create_refraction_table(self.mesh_num)
for cnt_line, line_img in enumerate(img):
cross_section = line_img/255*(refraction_max - refraction_min) + refraction_min # xとyの屈折率を同じにする。
table[:, :, cnt_line] = cross_section
return table
def create_refraction_table(self, mesh_num:MeshNum) -> np.ndarray:
table = np.zeros([mesh_num.x, mesh_num.y, mesh_num.z])
return table
def set_mesh_num_from_img(self, img: np.ndarray) -> MeshNum:
return MeshNum(img.shape[1], img.shape[1], img.shape[0])
def main():
loader = RefractionIdx()
loader.set_refraction_from_img("./image/test_pat.tif", 1., 1.2)
print(loader.table.shape)
#print(loader.table)
if __name__ == "__main__":
main()