6

次のような画像がたくさんあります。

ここに画像の説明を入力

対応するデータはありません。青い曲線上の約 100 ポイント (通常は x 間隔) を自動的に取得する必要があります。すべての曲線は非常に似ているため、少なくとも 1 ピクセルの精度が必要ですが、サブピクセルが望ましいでしょう。良いニュースは、すべての曲線が 0,0 から始まり、1,1 で終わることです。そのため、グリッドを忘れる可能性があります。

役立つPythonライブラリに関するヒントやその他のアプローチはありますか? ありがとう !

4

2 に答える 2

6

あなたの画像をファイルに保存しました14154233_input.png。そしたらこの番組

import pylab as plt
import numpy as np

# Read image from disk and filter all grayscale
im = plt.imread("14154233_input.png")[:,:,:3]
im -= im.mean(axis=2).reshape(im.shape[0], im.shape[1], 1).repeat(3,axis=2)
im_maxnorm = im.max(axis=2)

# Find y-position of remaining line
ypos = np.ones((im.shape[1])) * np.nan
for i in range(im_maxnorm.shape[1]):
    if im_maxnorm[:,i].max()<0.01:
        continue
    ypos[i] = np.argmax(im_maxnorm[:,i])

# Pick only values that are set
ys = 1-ypos[np.isfinite(ypos)]
# Normalize to 0,1
ys -= ys.min()
ys /= ys.max()

# Create x values
xs = np.linspace(0,1,ys.shape[0])

# Create plot of both 
# read and filtered image and
# data extracted
plt.figure(figsize=(4,8))
plt.subplot(211)
plt.imshow(im_maxnorm)
plt.subplot(212, aspect="equal")
plt.plot(xs,ys)
plt.show()

このプロットを生成します:

オースガベ

その後、必要xsysことは何でもできます。このコードを、xs と ys などを返す関数に入れる必要があるかもしれません。

各列にガウス分布を当てはめることで、精度を向上させることができます。本当に必要なら言ってください。

于 2013-01-04T10:17:27.113 に答える
1

まず、経由で画像を読み取ります

from scipy.misc import imread    
im = imread("thefile.png")

これにより、3 番目の次元がカラー チャネル (RGB + アルファ) である 3D numpy 配列が得られます。曲線は青いチャネルにありますが、グリッドもそこにあります。しかし、赤のチャネルでは、曲線ではなくグリッドがあります。だから私たちは使用します

a = im[:,:,2] - im[:,:,0]

ここで、各列に沿った最大値の位置が必要です。1 ピクセルの精度では、次の式で与えられます。

y0 = np.argmax(a, axis=0)

列に青い曲線がない場合、つまりフレームの外側にある場合、この結果はゼロです。でフレームの制限を取得できます

xmin, xmax = np.where(y0>0)[0][[0,-1]

これにより、x 軸を再スケーリングできる場合があります。

次に、サブピクセル解像度が必要です。1 つの列に注目しましょう

f=a[:,x]

ニュートン法の 1 回の反復を使用して、極値の位置を絞り込みます。

y1 = y0 - f'[y]/f''[y]

慎重なサンプリングのため、これ以上反復できないことに注意してください。それにもかかわらず、導関数の適切な近似が必要なため、両方に 5 ポイント スキームを使用します。

coefprime = np.array([1,-8, 0, 8, -1], float)
coefsec = np.array([-1, 16, -30, 16, -1], float)
y1 = y0 - np.dot(f[y0-2:y0+3], coefprime)/np.dot(f[y0-2:y0+3], coefsec)

PS : Thorsten Kranz は私よりも高速でしたが (少なくともここでは)、私の答えはサブピクセル精度であり、青い曲線を抽出する私の方法はおそらくより理解しやすいものです。

于 2013-01-04T13:23:28.220 に答える