【问题标题】:Determine distance between objects and its reflection确定物体及其反射之间的距离
【发布时间】:2019-06-22 09:58:28
【问题描述】:

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

图像是超低分辨率(15x20 像素)。我应用了谷歌的 RAISR AI 来放大图像并提高它们的质量。此外,我应用了一个模糊过滤器来帮助 opencv 制作轮廓。最后我应用轮廓,将相关区域标记为可见。

改进前:

改进后+轮廓:

这张具体的图片是好图片之一。问题是它们中的大多数看起来像这样:

外面有没有人知道如何测量物体与其反射之间的距离?

我最后的方法没有产生令人满意的结果。在那我会在物体上方休息。问题是物体(反射到相机的照明)改变了它的大小。

我该如何做这样的事情?

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

【问题讨论】:

  • 也许您可以在低分辨率图片上使用聚类算法?好像你总是有三个点+反射。或者可能是标签。我不认为,通过 AI 升级对科学图像来说是个好主意。您不会通过升级获得信息。也许有一些低分辨率的样本图像进行测试会很好
  • 低分辨率样本缺少信息。物体之间只有一个像素,因此无法分析距离。我认为,升级是一种必要的邪恶。
  • (1) 请发布您最好的原始图像,(2) 请提供对象的像素坐标和反射的像素坐标,以及 (3) 告诉我们您想要的距离度量。我想清楚图像中的内容以及您要查找的内容。否则,如果问题可以解决,那就是解决问题所需要的一切。我会尽量记得检查您的修改,而且,没有承诺,但如果我有时间,我们会看看我们是否可以为您解决它。
  • 第一个图像是最好的原始图像。我没有反射的坐标。只有在转换为更高分辨率之后,我才用 opencv 将一条线穿过轮廓。以像素为单位的距离就足够了。我只需要相对于彼此的距离就可以看到许多图像的变化。
  • 没关系,只需要图像即可。今天晚些时候将尝试解决。我设想了一些非常普遍的东西。 (我只是看了图片)。

标签: python opencv scipy scikit-image


【解决方案1】:

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

您有一台慢动作相机,因此您的图像可能比您需要的多。然后你可以使用多帧方法,如opencv super resolution

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

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

【讨论】:

    【解决方案2】:

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

    以下是说明其工作原理的示例代码。我们通过翻转图像来寻找反射,下面我们使用 roll() 来说明位移在坐标系中是如何工作的。然后,二维相关性可以衡量两个输入如何排列,作为一个相对于另一个的位移的函数。 (如果可以帮助您更轻松地了解其工作原理,请尝试使用一维数据进行试验。除了维度数量之外,二维数据没有什么不同)。

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

    还有一些涉及投影到(理想情况下)正交基组、小波等的技术。当基组与您想要找到的东西非常匹配时,这些方法效果最好。只要您在 Nyquist 限制范围内并满足基本 SNR 考虑,基于傅立叶变换的方法就可以很好地工作。但公平地说,FT 也是一个基组的扩展。

    最后,应该指出的是,没有任何技术可以创造新的信息。如果输入中不存在,则任何算法和代码都找不到它。

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

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

    这是使用原始图像的输出。注意局部最大值出现在相关性、自相关性以及滚动和翻转的位置。

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

    【讨论】:

    • 抱歉,我不明白这种方法对我有什么帮助。不过感谢您的努力。
    • @ArturMüllerRomanov 再仔细看看。局部最大值为您提供反射的偏移量。你有很多噪音和低分辨率,所以它很弱。但它就在那里,作为一个严格的数学事实,它与任何方法一样强大。除此之外,我做这种事情已经有 30 年了。
    • @ArturMüllerRomanov P/S 尝试一些一维示例来了解如何使用该方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2021-04-22
    • 2019-06-19
    相关资源
    最近更新 更多