図1のような二次元画像データにおいて、ガウシアンフィッティングを行い、一番明るい点を予測・検出したいです。
具体的には、画素値が255のピクセルを除いた範囲でフィッティングを行い、255の値の部分はフィッティングにより予測し、一番明るいであろう点(ピーク)を検出するという流れです。
現状、
・ガウシアン関数の係数(強度?)パラメーターを推定する方法
・範囲を指定してフィッティングをする手法(この場合,(0<x<85,115<x<200)、(0<y<85,115<y<200))
の2つがわかりません。
そのため、図2のようにフィッティングがうまくいっておりません。
理想的には、(0<x<85,115<x<200)、(0<y<85,115<y<200)の範囲で生データとfitting関数が一致するイメージです。
ご回答いただけると幸いです。
Python3
1import cv2 2from PIL import Image as pil 3import matplotlib.pyplot as plt 4import numpy as np 5from scipy.optimize import curve_fit 6 7# 画像読み込み 8"""#########画像データを入力##########""" 9img = cv2.imread("fig1.tif", cv2.IMREAD_GRAYSCALE) 10 11data = np.array(img) 12data = data/np.max(data) 13 14x,y=np.meshgrid(np.linspace(0,data.shape[1],data.shape[1]),np.linspace(0,data.shape[0],data.shape[0])) 15 16def twoDgaussian(X,wx,wy,x0,y0): 17 x,y=X 18 z=np.exp(-(x-x0)**2/wx**2-(y-y0)**2/wy**2) 19 return z.ravel() 20 21 22initial=(15,15,100,100) 23data_ravel=data.ravel() 24popt,pcov=curve_fit(twoDgaussian,(x,y),data_ravel,initial) 25 26################ガウス関数を2次元表示###################### 27z=np.exp(-(x-popt[2])**2/popt[0]**2-(y-popt[3])**2/popt[1]**2) 28 29fig = plt.figure() 30ax1 = fig.add_subplot(1, 2, 1) 31ax2 = fig.add_subplot(1, 2, 2) 32# プロット 33##x方向のプロット 34ax1.plot(x[100], z[100], color="green") 35ax1.plot(x[100], data[100], color="blue") 36 37##y方向のプロット 38ax2.plot(y[:,100], z[:,100], color="red") 39ax2.plot(y[:,100], data[:,100], color="black") 40# 凡例の表示 41plt.legend() 42 43# プロット表示(設定の反映) 44plt.show()
回答1件
あなたの回答
tips
プレビュー