質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2780閲覧

Python, 画像データにおけるガウシアンフィッティングの範囲指定

runrun5

総合スコア21

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/17 06:40

編集2020/05/07 06:23

図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()

イメージ説明
fig1

イメージ説明
fig2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bamboo-nova

2020/05/01 18:01

カットせずに実行させたい理由がよくわからないのですが、ピークの座標周辺nピクセルの画像をコピーして特定の処理(Gaussian filter)をしてから置換してフィッティング結果を入れるアプローチではダメなのでしょうか。
runrun5

2020/05/05 02:03

コメントありがとうございます。 ただいまご指摘のような手法でコードを作成しておりますので、追って編集いたします。
guest

回答1

0

自己解決

強度をパラメータとすることでうまくフィッティングできました。

投稿2020/07/27 12:18

runrun5

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問