質問編集履歴
4
質問内容を変更しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,18 +1,28 @@
|
|
1
|
-
|
1
|
+
図1のような二次元画像データにおいて、ガウシアンフィッティングを行い、一番明るい点を予測・検出したいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ピ
|
5
|
+
具体的には、画素値が255のピクセルを除いた範囲でフィッティングを行い、255の値の部分はフィッティングにより予測し、一番明るいであろう点(ピーク)を検出するという流れです。
|
6
|
-
|
7
|
-
そこで一番明るい点を初期値として、赤枠のようにフィッティングする範囲を指定したいです。
|
8
6
|
|
9
7
|
|
10
8
|
|
9
|
+
現状、
|
10
|
+
|
11
|
+
・ガウシアン関数の係数(強度?)パラメーターを推定する方法
|
12
|
+
|
11
|
-
|
13
|
+
・範囲を指定してフィッティングをする手法(この場合,(0<x<85,115<x<200)、(0<y<85,115<y<200))
|
14
|
+
|
15
|
+
の2つがわかりません。
|
12
16
|
|
13
17
|
|
14
18
|
|
15
|
-
|
19
|
+
そのため、図2のようにフィッティングがうまくいっておりません。
|
20
|
+
|
21
|
+
理想的には、(0<x<85,115<x<200)、(0<y<85,115<y<200)の範囲で生データとfitting関数が一致するイメージです。
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
ご回答いただけると幸いです。
|
16
26
|
|
17
27
|
|
18
28
|
|
@@ -20,17 +30,25 @@
|
|
20
30
|
|
21
31
|
import cv2
|
22
32
|
|
23
|
-
import numpy as np
|
24
|
-
|
25
33
|
from PIL import Image as pil
|
26
34
|
|
27
35
|
import matplotlib.pyplot as plt
|
36
|
+
|
37
|
+
import numpy as np
|
28
38
|
|
29
39
|
from scipy.optimize import curve_fit
|
30
40
|
|
31
41
|
|
32
42
|
|
43
|
+
# 画像読み込み
|
44
|
+
|
45
|
+
"""#########画像データを入力##########"""
|
46
|
+
|
33
|
-
|
47
|
+
img = cv2.imread("fig1.tif", cv2.IMREAD_GRAYSCALE)
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
data = np.array(img)
|
34
52
|
|
35
53
|
data = data/np.max(data)
|
36
54
|
|
@@ -50,32 +68,62 @@
|
|
50
68
|
|
51
69
|
|
52
70
|
|
53
|
-
initial=(50,50,778,1081)
|
54
71
|
|
72
|
+
|
55
|
-
|
73
|
+
initial=(15,15,100,100)
|
56
74
|
|
57
75
|
data_ravel=data.ravel()
|
58
76
|
|
59
|
-
popt,pcov=curve_fit(twoDgaussian,(x,y),data_ravel,initial
|
77
|
+
popt,pcov=curve_fit(twoDgaussian,(x,y),data_ravel,initial)
|
60
|
-
|
61
|
-
x1 = popt[2]
|
62
|
-
|
63
|
-
y1 = popt[3]
|
64
|
-
|
65
|
-
print(x1,y1)
|
66
78
|
|
67
79
|
|
68
80
|
|
69
|
-
|
81
|
+
################ガウス関数を2次元表示######################
|
70
82
|
|
71
|
-
|
83
|
+
z=np.exp(-(x-popt[2])**2/popt[0]**2-(y-popt[3])**2/popt[1]**2)
|
72
84
|
|
73
|
-
plt.imshow(im_list, cmap = "gray")
|
74
85
|
|
86
|
+
|
87
|
+
fig = plt.figure()
|
88
|
+
|
89
|
+
ax1 = fig.add_subplot(1, 2, 1)
|
90
|
+
|
91
|
+
ax2 = fig.add_subplot(1, 2, 2)
|
92
|
+
|
93
|
+
# プロット
|
94
|
+
|
95
|
+
##x方向のプロット
|
96
|
+
|
75
|
-
|
97
|
+
ax1.plot(x[100], z[100], color="green")
|
98
|
+
|
99
|
+
ax1.plot(x[100], data[100], color="blue")
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
##y方向のプロット
|
104
|
+
|
105
|
+
ax2.plot(y[:,100], z[:,100], color="red")
|
106
|
+
|
107
|
+
ax2.plot(y[:,100], data[:,100], color="black")
|
108
|
+
|
109
|
+
# 凡例の表示
|
110
|
+
|
111
|
+
plt.legend()
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
# プロット表示(設定の反映)
|
76
116
|
|
77
117
|
plt.show()
|
78
118
|
|
79
119
|
```
|
80
120
|
|
121
|
+
![イメージ説明](4723457f9425b7319e01cc06ba22827c.jpeg)
|
122
|
+
|
123
|
+
fig1
|
124
|
+
|
125
|
+
|
126
|
+
|
81
|
-
![イメージ説明](
|
127
|
+
![イメージ説明](19b6e811c583a6f9a8bd998c238e447e.png)
|
128
|
+
|
129
|
+
fig2
|
3
タイトルおよび内容の修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Python
|
1
|
+
Python, 画像データにおけるガウシアンフィッティングの範囲指定
|
test
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
-
下記のような二次元画像データ
|
1
|
+
下記のような二次元画像データにおいて、ガウシアンフィッティングを行い、一番明るい点を予測・検出したいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ピークの検出は可能なのですが、下図の3次元画像のように明るい点が複数あるので、他の明るい点に引っ張られてピークが少しずれてしまいます。
|
5
|
+
ピーク(予想される一番明るい点)の検出は可能なのですが、下図の3次元画像のように明るい点が複数あるので、他の明るい点に引っ張られてピークが少しずれてしまいます。
|
6
6
|
|
7
|
-
そこで一番明るい点を初期値として、フィッティングする範囲を指定し
|
7
|
+
そこで一番明るい点を初期値として、赤枠のようにフィッティングする範囲を指定したいです。
|
8
|
-
|
9
|
-
正直どこが原因なのかわからないため教えていただけると幸いです。
|
10
8
|
|
11
9
|
|
12
10
|
|
11
|
+
”param_bounds”でパラメーターの範囲指定を行えばいいと考えたのですが、x0,y0の範囲が狭まるだけで、本質的には全てのx,y座標がフィッティングされてしまっていると考えられ、なかなか良い手法が見つかりません。
|
12
|
+
|
13
|
+
|
14
|
+
|
13
|
-
|
15
|
+
画像のカットなどは行わず、ガウシアンフィッティングの範囲を指定する手法を教えていただけると幸いです。
|
14
16
|
|
15
17
|
|
16
18
|
|
@@ -76,14 +78,4 @@
|
|
76
78
|
|
77
79
|
```
|
78
80
|
|
79
|
-
|
80
|
-
|
81
|
-
![![イメージ説明](8f36ef664bc6e8f6b271d93d4b35eb69.png)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
![イメージ説明](
|
81
|
+
![イメージ説明](5b70689fe7c0d06ec0d0da56bf8bb3d9.png)
|
86
|
-
|
87
|
-
3次元表示するとこの画像のようになります。
|
88
|
-
|
89
|
-
上の画像の白い点が多数あります。
|
2
範囲指定してフィッティングを行うような仕様に変更。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Python3,
|
1
|
+
Python3, 画像データにおける範囲指定を行ったガウシアンフィッティング
|
test
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
ピークの検出は可能なのですが、下図の3次元画像のように明るい点が複数あるので、他の明るい点に引っ張られてピークが少しずれてしまいます。
|
6
6
|
|
7
|
+
そこで一番明るい点を初期値として、フィッティングする範囲を指定し、実行したのですが、それでもずれてしまいます。
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
正直どこが原因なのかわからないため教えていただけると幸いです。
|
10
10
|
|
11
11
|
|
12
12
|
|
@@ -14,111 +14,63 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
+
```Python3
|
18
|
+
|
19
|
+
import cv2
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from PIL import Image as pil
|
24
|
+
|
25
|
+
import matplotlib.pyplot as plt
|
26
|
+
|
17
|
-
|
27
|
+
from scipy.optimize import curve_fit
|
18
28
|
|
19
29
|
|
20
30
|
|
21
|
-
|
31
|
+
data = np.array(pil.open("test.tif"))
|
22
32
|
|
23
|
-
|
33
|
+
data = data/np.max(data)
|
24
|
-
|
25
|
-
import numpy as np
|
26
|
-
|
27
|
-
import pylab as plt
|
28
|
-
|
29
|
-
from PIL import Image as pil
|
30
34
|
|
31
35
|
|
32
36
|
|
33
|
-
#define model function and pass independant variables x and y as a list
|
34
|
-
|
35
|
-
def twoD_Gaussian(XY, amplitude, xo, yo, sigma_x, sigma_y, theta, offset):
|
36
|
-
|
37
|
-
x,y = XY[0:2]
|
38
|
-
|
39
|
-
xo = float(xo)
|
40
|
-
|
41
|
-
yo = float(yo)
|
42
|
-
|
43
|
-
a = (np.cos(theta)**2)/(2*sigma_x**2) + (np.sin(theta)**2)/(2*sigma_y**2)
|
44
|
-
|
45
|
-
|
37
|
+
x,y=np.meshgrid(np.linspace(0,data.shape[1],data.shape[1]),np.linspace(0,data.shape[0],data.shape[0]))
|
46
|
-
|
47
|
-
c = (np.sin(theta)**2)/(2*sigma_x**2) + (np.cos(theta)**2)/(2*sigma_y**2)
|
48
|
-
|
49
|
-
g = offset + amplitude*np.exp( - (a*((x-xo)**2) + 2*b*(x-xo)*(y-yo)
|
50
|
-
|
51
|
-
+ c*((y-yo)**2)))
|
52
|
-
|
53
|
-
return g.ravel()
|
54
38
|
|
55
39
|
|
56
40
|
|
41
|
+
def twoDgaussian(X,wx,wy,x0,y0):
|
57
42
|
|
43
|
+
x,y=X
|
58
44
|
|
59
|
-
|
45
|
+
z=np.exp(-(x-x0)**2/wx**2-(y-y0)**2/wy**2)
|
60
46
|
|
61
|
-
x = np.linspace(0, 2047, 2048)
|
62
|
-
|
63
|
-
y = np.linspace(0, 2047, 2048)
|
64
|
-
|
65
|
-
|
47
|
+
return z.ravel()
|
66
48
|
|
67
49
|
|
68
50
|
|
69
|
-
|
51
|
+
initial=(50,50,778,1081)
|
70
52
|
|
71
|
-
|
53
|
+
param_bounds = ((-np.inf, -np.inf, initial[2]-20, initial[3]-20), (np.inf, np.inf, initial[2]+20, initial[3]+20))
|
72
54
|
|
73
|
-
|
55
|
+
data_ravel=data.ravel()
|
74
56
|
|
75
|
-
i
|
57
|
+
popt,pcov=curve_fit(twoDgaussian,(x,y),data_ravel,initial, bounds=param_bounds)
|
76
58
|
|
77
|
-
|
59
|
+
x1 = popt[2]
|
78
60
|
|
79
|
-
|
61
|
+
y1 = popt[3]
|
62
|
+
|
63
|
+
print(x1,y1)
|
80
64
|
|
81
65
|
|
82
66
|
|
67
|
+
im = cv2.imread("test.tif", 0)
|
83
68
|
|
69
|
+
im_list = np.asarray(im)
|
84
70
|
|
85
|
-
|
71
|
+
plt.imshow(im_list, cmap = "gray")
|
86
72
|
|
87
|
-
plt.figure()
|
88
|
-
|
89
|
-
plt.
|
73
|
+
plt.plot(x1,y1,marker='.')
|
90
|
-
|
91
|
-
plt.colorbar()
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
# add some noise to the data and try to fit the data generated beforehand
|
96
|
-
|
97
|
-
initial_guess = (3,100,100,20,40,0,10)
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
data_noisy = data + 0.2*np.random.normal(size=data.shape)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
popt, pcov = opt.curve_fit(twoD_Gaussian, (x, y), data_noisy, p0=initial_guess)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
data_fitted = twoD_Gaussian((x, y), *popt)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
fig, ax = plt.subplots(1, 1)
|
114
|
-
|
115
|
-
ax.hold(True)
|
116
|
-
|
117
|
-
ax.imshow(data_noisy.reshape(2048, 2048), cmap=plt.cm.jet, origin='bottom',
|
118
|
-
|
119
|
-
extent=(x.min(), x.max(), y.min(), y.max()))
|
120
|
-
|
121
|
-
ax.contour(x, y, data_fitted.reshape(2048, 2048), 8, colors='w')
|
122
74
|
|
123
75
|
plt.show()
|
124
76
|
|
@@ -126,8 +78,12 @@
|
|
126
78
|
|
127
79
|
|
128
80
|
|
81
|
+
![![イメージ説明](8f36ef664bc6e8f6b271d93d4b35eb69.png)
|
82
|
+
|
83
|
+
|
84
|
+
|
129
85
|
![イメージ説明](d77d5df22cddc52edbf6c998025efc36.png)
|
130
86
|
|
131
|
-
3次元表示すると
|
87
|
+
3次元表示するとこの画像のようになります。
|
132
88
|
|
133
|
-
|
89
|
+
上の画像の白い点が多数あります。
|
1
回答していただきたい点を具体化しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -123,3 +123,11 @@
|
|
123
123
|
plt.show()
|
124
124
|
|
125
125
|
```
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
![イメージ説明](d77d5df22cddc52edbf6c998025efc36.png)
|
130
|
+
|
131
|
+
3次元表示すると上の画像のようになります。
|
132
|
+
|
133
|
+
ピークが欠けてしまっているため、curvefitting(ガウシアンフィッティング)でピークを予測したいです。
|