确定物体之间的距离及其反射

时间:2019-01-29 09:52:54

标签: python opencv scipy scikit-image

我正在尝试测量物体与其反射之间的距离。上方的“线”是反射。下方是对象本身。对象是螺旋形的,这进一步恶化了对象的视线。投射在对象上的光只能部分反射,看起来好像对象将改变其大小。光线是在慢动作摄像机中产生的(每秒5000张图像),并被投射到物体上以使其可见。对象永久移动(所有轴)。我正在尝试从这些图像中分析其运动。

图像具有超低分辨率(15x20像素)。我应用了Google RAISR AI来放大图像并提高其质量。另外,我应用了模糊滤镜来帮助opencv绘制轮廓。最后,我应用轮廓,以标记可见的相关区域。

改进前:

enter image description here

改善后+轮廓:

enter image description here

此特定图片是其中一张好照片。问题是它们大多数看起来像这样:

enter image description here enter image description here enter image description here enter image description here

外面有人吗,我有一个想法如何测量物体与其反射之间的距离?

我的最后一种方法未取得令人满意的结果。这样,我将在对象上方进行突破。问题是对象(相机的反射光)会改变其大小。

enter image description here enter image description here enter image description here

我该怎么做?

enter image description here

我有一个很好的老板。我不想告诉他我无法解决这个问题。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

看来您的主要问题是分辨率低。在我看来,RAISR AI是一种单帧超分辨率方法。

您有一台慢动作摄像机,因此也许您所需要的图像更多。然后,您可以使用opencv super resolution

中的多帧方法

通过多帧方法,您可以获得更多真实信息。单帧方法只是估计更多信息。

您用标记了这个问题:一个问题可能是,超分辨率不是opencv python版本的一部分。因此,也许您需要使用ctypes或其他包装器解决方案。

答案 1 :(得分:0)

基于二维关联的技术提供了丰富的识别和定位对象和反射的功能。

下面是一个示例代码,说明了它是如何工作的。我们期待为反射通过翻转图像,并在我们使用滚以下()来说明位移坐标系中是如何工作的。然后,二维相关性可以使您根据两个输入之间的相对位置来衡量两个输入的排列方式。 (尝试用一维数据进行实验,如果它可以帮助您更轻松地了解其工作原理,那么二维中除维数方面没有其他区别。)

在这里,我们采取粗略的方法并使用整个图像。由于我们正在使用傅立叶变换,因此可以。但是,如果您可以识别并切除一部分图像作为参考,有时可以提高性能。

也有涉及投影技术到(理想)正交基组,小波等,这些方法效果最好,当基组是你想找到的东西一个很好的匹配。只要您在Nyquist限制之内并且满足基本的SNR考虑因素,基于傅立叶变换的方法就可以很好地工作。但公平地说,《金融时报》也是对基础集的扩展。

最后,应该指出的是,任何技术都不能创造新的信息。如果它不存在在输入,没有算法和没有的代码量会发现它。

好的,这是示例代码演示的相关性。

#!/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()

这里是使用原始图像的输出。通知其中所述局部最大值发生在相关性,对于自相关和用于辊和翻转。

Output from the sample code

请参见此处底部列出的示例:scipy.signal.correlate2d