首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像分析曲线拟合

图像分析曲线拟合
EN

Stack Overflow用户
提问于 2013-01-04 17:17:50
回答 2查看 3.4K关注 0票数 6

我有一堆像这样的图片:

对应的数据不可用。我需要在蓝色曲线上自动检索大约100个点(通常是x间隔的)。所有的曲线都非常相似,所以我需要至少1个像素的精度,但亚像素将是首选。好消息是所有曲线都从0,0开始,到1,1结束,所以我们可能会忘记网格。

关于Python库的任何提示可以帮助或任何其他方法?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-04 18:17:27

我把你的图片保存到了14154233_input.png文件中。然后这个程序

代码语言:javascript
复制
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做任何您想做的事情。也许你应该把这段代码放在一个返回x和y的函数中。

人们可以通过在每一列上拟合高斯分布来提高精度。如果你真的需要,告诉我。

票数 6
EN

Stack Overflow用户

发布于 2013-01-04 21:23:28

首先,通过

代码语言:javascript
复制
from scipy.misc import imread    
im = imread("thefile.png")

这给出了一个3Dnumpy数组,第三维是颜色通道(RGB+alpha)。曲线在蓝色通道中,但栅格也在那里。但是在红色通道中,你有网格,而不是曲线。所以我们使用

代码语言:javascript
复制
a = im[:,:,2] - im[:,:,0]

现在,我们需要沿着每一列的最大值的位置。对于一个像素精度,它由下式给出

代码语言:javascript
复制
y0 = np.argmax(a, axis=0)

当列中没有蓝色曲线时,结果为零,即在框架外。On可以通过以下方式获得帧的限制

代码语言:javascript
复制
xmin, xmax = np.where(y0>0)[0][[0,-1]

使用此选项,您可以重新缩放x轴。

然后,您需要亚像素分辨率。让我们来关注一个单独的专栏

代码语言:javascript
复制
f=a[:,x]

我们使用牛顿法的一次迭代来改进极值的位置。

代码语言:javascript
复制
y1 = y0 - f'[y]/f''[y]

请注意,由于谨慎采样,我们不能进一步迭代。然而,我们想要一个很好的衍生品近似值,所以我们将对这两种情况使用5点方案。

代码语言:javascript
复制
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)

附言: Thorsten Kranz比我快(至少在这里),但我的答案是亚像素精度,我提取蓝色曲线的方法可能更容易理解。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14154233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档