質問編集履歴

4

質問内容を変更しました。

2020/05/07 06:23

投稿

runrun5
runrun5

スコア21

test CHANGED
File without changes
test CHANGED
@@ -1,18 +1,28 @@
1
- 下記のような二次元画像データにおいて、ガウシアンフィッティングを行い、一番明るい点を予測・検出したいです。
1
+ 図1のような二次元画像データにおいて、ガウシアンフィッティングを行い、一番明るい点を予測・検出したいです。
2
2
 
3
3
 
4
4
 
5
- (予想される一番明る点)の検出は可能なのすが下図3次元画像のように明るい点が複数るので、他の明るいに引っ張られてピークが少しずてしまいます。
5
+ 具体的には、画素値が255のピクセルを除た範囲フィッティングを行い255部分はフィッティングにり予測し、一番明るいろう(ピーク)を検出するという流す。
6
-
7
- そこで一番明るい点を初期値として、赤枠のようにフィッティングする範囲を指定したいです。
8
6
 
9
7
 
10
8
 
9
+ 現状、
10
+
11
+ ・ガウシアン関数の係数(強度?)パラメーターを推定する方法
12
+
11
- ”param_bounds”でパラメーターの範囲指定を行えばいいと考えたのですが、x0,y0の範囲が狭まるだけで、本質的には全のx,y座標がフィッティングされてしまっていと考えられ、なかなか良い手法が見つかりません。
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
- data = np.array(pil.open("test.tif"))
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
- param_bounds = ((-np.inf, -np.inf, initial[2]-20, initial[3]-20), (np.inf, np.inf, initial[2]+20, initial[3]+20))
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, bounds=param_bounds)
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
- im = cv2.imread("test.tif", 0)
81
+ ################ガウス関数を2次元表示######################
70
82
 
71
- im_list = np.asarray(im)
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
- plt.plot(x1,y1,marker='.')
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
- ![イメージ説明](5b70689fe7c0d06ec0d0da56bf8bb3d9.png)
127
+ ![イメージ説明](19b6e811c583a6f9a8bd998c238e447e.png)
128
+
129
+ fig2

3

タイトルおよび内容の修正

2020/05/07 06:23

投稿

runrun5
runrun5

スコア21

test CHANGED
@@ -1 +1 @@
1
- Python3, 画像データにおける範囲指定を行ったガウシアンフィッティング
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
- ![イメージ説明](d77d5df22cddc52edbf6c998025efc36.png)
81
+ ![イメージ説明](5b70689fe7c0d06ec0d0da56bf8bb3d9.png)
86
-
87
- 3次元表示するとこの画像のようになります。
88
-
89
- 上の画像の白い点が多数あります。

2

範囲指定してフィッティングを行うような仕様に変更。

2020/04/29 07:31

投稿

runrun5
runrun5

スコア21

test CHANGED
@@ -1 +1 @@
1
- Python3, 2次元画像データガウシアンフィッティングによるピーク検出
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
- ![![イメージ説明](8f36ef664bc6e8f6b271d93d4b35eb69.png)
27
+ from scipy.optimize import curve_fit
18
28
 
19
29
 
20
30
 
21
- ```python
31
+ data = np.array(pil.open("test.tif"))
22
32
 
23
- import scipy.optimize as opt
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
- b = -(np.sin(2*theta))/(4*sigma_x**2) + (np.sin(2*theta))/(4*sigma_y**2)
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
- # Create x and y indices
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
- x, y = np.meshgrid(x, y)
47
+ return z.ravel()
66
48
 
67
49
 
68
50
 
69
- #create data
51
+ initial=(50,50,778,1081)
70
52
 
71
- org_img = Image.open("diff.tif")
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
- img = ImageOps.grayscale(org_img)
57
+ popt,pcov=curve_fit(twoDgaussian,(x,y),data_ravel,initial, bounds=param_bounds)
76
58
 
77
- # 配列化
59
+ x1 = popt[2]
78
60
 
79
- data = np.asarray(img)
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
- # plot twoD_Gaussian data generated above
71
+ plt.imshow(im_list, cmap = "gray")
86
72
 
87
- plt.figure()
88
-
89
- plt.imshow(data.reshape(2048, 2048))
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
- ピーク欠けてしっているため、curvefitting(ガウシアンフィッティング)でピークを予測したいです。
89
+ 上の画像の白い点多数あります。

1

回答していただきたい点を具体化しました。

2020/04/28 07:44

投稿

runrun5
runrun5

スコア21

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(ガウシアンフィッティング)でピークを予測したいです。