我有一堆像这样的图像:
相应的数据不可用。我需要在蓝色曲线上自动检索大约100个点(通常是x间距)。所有曲线非常相似,因此我需要至少1个像素精度,但子像素将是首选。好消息是所有曲线都从0,0开始到1,1结束,所以我们可能会忘记网格。
有关Python库的任何提示可能有所帮助或任何其他方法?谢谢!
答案 0 :(得分: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()
制作此情节:
然后,您可以根据需要使用xs
和ys
。也许你应该把这段代码放在一个返回xs和ys左右的函数中。
人们可以通过在每列左右安装高斯人来提高精度。如果你真的需要它,请告诉我。
答案 1 :(得分:1)
首先,通过
阅读图像from scipy.misc import imread
im = imread("thefile.png")
这给出了一个3D 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)
P.S。 :Thorsten Kranz比我快(至少在这里),但我的回答是亚像素精度,我提取蓝色曲线的方式可能更容易理解。