Python 图像分析曲线拟合

Python 图像分析曲线拟合,python,image-processing,curve-fitting,Python,Image Processing,Curve Fitting,我有一堆像这样的图片: 相应的数据不可用。我需要在蓝色曲线上自动检索大约100个点(规则的x间隔)。所有曲线都非常相似,所以我需要至少1像素的精度,但亚像素将是首选。好消息是所有曲线都从0,0开始,并在1,1结束,因此我们可能会忘记网格 关于pythonlibs的任何提示都有帮助吗?谢谢 我将您的图像保存到一个文件14154233_input.png。那么这个节目呢, import pylab as plt import numpy as np # Read image from disk

我有一堆像这样的图片:

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


关于pythonlibs的任何提示都有帮助吗?谢谢

我将您的图像保存到一个文件
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()
将pylab作为plt导入
将numpy作为np导入
#从磁盘读取图像并过滤所有灰度
im=plt.imread(“14154233_input.png”)[:,:,:3]
im-=im.平均值(轴=2)。重塑(im.形状[0],im.形状[1],1)。重复(3,轴=2)
im_maxnorm=im.max(轴=2)
#找到剩余直线的y位置
ypos=np.ones((im.shape[1])*np.nan
对于范围内的i(im_maxnorm.shape[1]):

如果im_maxnorm[:,i].max()首先,通过

from scipy.misc import imread    
im = imread("thefile.png")
这提供了一个三维numpy阵列,第三维是颜色通道(RGB+alpha)。曲线在蓝色通道中,但网格也在那里。但在红色通道中,有网格而不是曲线。所以我们用

a = im[:,:,2] - im[:,:,0]
现在,我们需要沿着每列的最大值的位置。对于一个像素精度,它由

y0 = np.argmax(a, axis=0)
如果列中没有蓝色曲线,即帧外,则结果为零。On可以通过以下方式获得帧的限制:

xmin, xmax = np.where(y0>0)[0][[0,-1]
使用此选项,可以重新缩放x轴

然后,你需要亚像素分辨率。让我们集中讨论一个专栏

f=a[:,x]
我们使用牛顿法的一次迭代来优化极值的位置

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)

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

有趣的问题,我正在研究解决方案,但亚像素精度不太可能。只是半自动的,但仍然与问题相关,这个web应用程序可以创造奇迹:我对pylab不实用,我能请你解释一下
im-=im.mean(axis=2)。重塑(im.shape[0],im.shape[1],1)。重复(3,axis=2)
行是如何工作的吗?当然。imread为我们提供了一个RGBA图像,也就是说,我们的数组具有形状(x,y,4),我通过丢弃alpha(前一行中的[:,:,:3])立即减小了形状。然后我想将所有红=绿=蓝(从黑到白的所有灰色)的颜色设置为黑色,这样只剩下蓝线。我通过减去每个像素的R、G和B值的平均值来实现这一点。如果它们相等,则全部为零
.mean(axis=2)
计算平均值,形成二维数组
.reforme()
只需添加一个3,即可使其再次成为3d。透镜1的暗度
.repeat()
将数组的形状重置为
im