Python 确定对象及其反射之间的距离
我试图测量物体与其反射之间的距离。上面的“线”是反射。较低的是对象本身。对象是一个螺旋,这进一步恶化了对象上的视图。投射到物体上的光线只反射了部分光线,使物体看起来好像要改变大小。光线由慢镜头(每秒5000张图像)产生,投射到物体上使其可见。对象正在永久移动(所有轴)。我试图从这些图像分析它的运动 图像为超低分辨率(15x20像素)。我用谷歌RAISR人工智能来放大图像,提高图像质量。此外,我还应用了模糊过滤器来帮助opencv生成轮廓。最后,我应用等高线来标记相关的可见区域 改善前: 改进+轮廓后: 这张照片是其中一张好照片。问题是,它们中的大多数看起来像这样: 有没有人知道我该如何测量物体和它的反射之间的距离 我的最后一种方法没有产生令人满意的结果。因为我会在物体上方做一个休息。问题是对象(反射到摄影机的照明)更改了其大小 我该怎么做这样的事Python 确定对象及其反射之间的距离,python,opencv,scipy,scikit-image,Python,Opencv,Scipy,Scikit Image,我试图测量物体与其反射之间的距离。上面的“线”是反射。较低的是对象本身。对象是一个螺旋,这进一步恶化了对象上的视图。投射到物体上的光线只反射了部分光线,使物体看起来好像要改变大小。光线由慢镜头(每秒5000张图像)产生,投射到物体上使其可见。对象正在永久移动(所有轴)。我试图从这些图像分析它的运动 图像为超低分辨率(15x20像素)。我用谷歌RAISR人工智能来放大图像,提高图像质量。此外,我还应用了模糊过滤器来帮助opencv生成轮廓。最后,我应用等高线来标记相关的可见区域 改善前: 改进+
我有一个很好的老板。我不想告诉他我解决不了这个问题。非常感谢您的帮助。您的主要问题似乎是分辨率低。在我看来,RAISR AI是一种单帧超分辨率方法 你有一个慢镜头相机,所以你可能有比你需要更多的图像。然后可以使用多帧方法,如中所示 使用多帧方法,您可以获得更多真实信息。单帧方法只是估计更多的信息
您将这个问题标记为:问题可能是,超级分辨率不是opencv python版本的一部分。因此,您可能需要一个解决方案或其他包装解决方案 基于二维相关性的技术为识别和定位物体和反射提供了丰富的功能 下面是一个示例代码,说明了这是如何工作的。我们通过翻转图像来寻找反射,下面我们使用roll()来说明置换如何在坐标系中工作。然后,二维相关性为您提供了两个输入如何作为一个相对于另一个的置换函数排列的度量。(如果一维数据有助于你更容易地了解其工作原理,那么试着用一维数据进行实验。二维数据除了维数外,没有什么不同) 这里我们采用粗略的方法,使用整个图像。因为我们使用的是傅里叶变换,所以这没问题。但是,如果可以识别并删除一段图像作为参考,有时可以提高性能 还有一些技术涉及到(理想情况下)正交基集的投影、小波等。当基集与您想要找到的东西很匹配时,这些方法最有效。只要在奈奎斯特极限内并满足基本的信噪比要求,基于傅里叶变换的方法就可以很好地工作。但公平地说,英国《金融时报》也是一个基数的扩张 最后,应该指出的是,任何技术都不能创造新的信息。如果它不在输入中,则没有算法和大量代码会找到它 好的,下面是演示相关性的示例代码
#!/usr/bin/python
import numpy as np
import matplotlib.pylab as plt
from scipy.signal import correlate2d
plt.figure( figsize=[6,8] )
im = plt.imread("temp.png")
# For simplicity of exposition, we just sum the three color channels.
im1 = np.sum(im,axis=2)
ny = 5
nx = 2
n1 = 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow( im1 )
ax.set_title( 'raw' )
ax.set_aspect( 'equal' )
corr = correlate2d( im1, im1, boundary='symm', mode='same')
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf( corr, 20 )
ax.set_title( 'auto-correlation' )
ax.set_aspect( 'equal' )
for a in 0, 1:
imtest = np.roll(im1,4,axis=a)
corr = correlate2d( im1, imtest, boundary='symm', mode='same')
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow( imtest )
ax.set_title( 'roll axis %d'%a )
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf( corr, 20 )
ax.set_title( 'correlation, roll axis %d'%a )
ax.set_aspect( 'equal' )
imtest = np.flip(im1,axis=a)
corr = correlate2d( im1, imtest, boundary='symm', mode='same')
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.imshow( imtest )
ax.set_title( 'flip axis %d'%a )
n1 += 1
ax = plt.subplot( ny, nx, n1 )
ax.contourf( corr, 20 )
ax.set_title( 'correlation, flip axis %d'%a )
ax.set_aspect( 'equal' )
plt.tight_layout()
plt.show()
这是使用原始图像的输出。请注意局部最大值出现在自相关和翻滚与翻转的相关性中的位置
请参阅下面列出的示例:也许您可以在低分辨率图片上使用聚类算法?看起来你总是有三个点+反射。或者贴标签。我不认为,通过人工智能提升尺度对科学图像来说是个好主意;你不能通过扩大规模获得信息。也许有一些低分辨率的样本图像可以用来测试低分辨率样本缺乏信息。对象之间只有一个像素,因此无法分析距离。我认为,放大是一个必要的缺点。(1)请发布您最好的原始图像,(2)请提供对象的像素坐标及其反射的像素坐标,以及(3)告诉我们您想要的距离度量。我想弄清楚图像中的内容以及您要查找的内容。否则,如果问题能够解决,那就是解决它所需要的全部。我会尽量记得检查你的修订,没有承诺,但如果我有时间,我们会看看我们是否可以为你解决它。第一张图像是最好的原始图像。我没有反射的坐标。只有在转换到更高分辨率后,我才用opencv在轮廓上画了一条线。像素距离就足够了。我只需要相对的距离就可以看到许多图像的变化。没关系,图像就是所需要的一切。我今天晚些时候会设法去的。我设想的事情将是相当普遍的。(我只是看了看图片)。对不起,我不明白这种方法对我有什么帮助。谢谢你的努力。@ArturMüllerRomanov再仔细看看。局部最大值给出反射的偏移量。你有很多噪音和低分辨率,所以它很弱。但它确实存在,而且作为一个严格的数学事实,它和任何方法一样稳健。除此之外,我已经做这类事情大约30年了。@ArturMüllerRomanov P/S尝试一些1-d的例子来发展一些如何使用这种方法的感觉。