【问题标题】:Aligning array values对齐数组值
【发布时间】:2014-07-02 10:00:11
【问题描述】:

假设我有两个数组,两个数组的值都代表太阳的亮度。第一个数组具有早上测量的值,第二个数组具有晚上测量的值。在实际情况下,我有大约 80 个数组。我将使用 matplotlib 绘制图片。绘制的圆圈将(在两种情况下)大小相同。但是,由于地球的运动,图像的位置会发生一些变化,应该避免这种情况。

>>> array1
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 1, 3, 1, 0]
[0, 0, 1, 1, 2, 0]
[0, 0, 1, 1, 1, 0]
[0, 0, 0, 0, 0, 0]

>>> array2
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 1, 2, 1, 0]
[0, 0, 1, 1, 4, 0]
[0, 0, 1, 1, 1, 0]

在上面的示例中,较大的值意味着较亮的点,零值被绘制为黑色空间。数组的大小始终相同。如何将 array2 中的重要值(非零)与 array1 中的值对齐?所以结果应该是这样的。

>>> array2(aligned)
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 1, 2, 1, 0]
[0, 0, 1, 1, 4, 0]
[0, 0, 1, 1, 1, 0]
[0, 0, 0, 0, 0, 0]

必须这样做才能以有意义的方式对数组进行后处理,例如计算平均值或总和等。注意!查找质心点并进行相应的对齐不起作用,因为边缘可能会在一天中发生变化。

【问题讨论】:

  • 4 是从哪里来的?
  • 一个错误,现在编辑:)
  • 您可以尝试使用中心思想,但不是在数组本身上,而是在这些数组的布尔掩码上(在这种情况下,质心和中位数可能非常接近)
  • 对齐图像是一个完整的研究子领域 ;)

标签: python arrays numpy matplotlib


【解决方案1】:

可能会导致此类数据出现问题的一件事是图像与像素没有很好地对齐。我尝试用两个带有正方形的数组来说明我的观点:

array1:
0 0 0 0 0
0 2 2 2 0
0 2 2 2 0
0 2 2 2 0
0 0 0 0 0

array2:
0 0 0 0 0
0 1 2 2 1
0 1 2 2 1
0 1 2 2 1
0 0 0 0 0

如您所见,有限的分辨率是一个挑战,因为图像移动了 0.5 像素。

当然,计算这两者的 COG 很容易,看到第一个数组为 (row,column=2,2),第二个数组为 (2, 2.5)。但是,如果我们将第二个数组向左移动 0.5,我们会得到:

array2_shifted:
  0   0   0   0   0
0.5 1.5 2.0 1.5 0.5
0.5 1.5 2.0 1.5 0.5
0.5 1.5 2.0 1.5 0.5
  0   0   0   0   0

所以事情开始蔓延。

当然,您的阵列可能足够大,因此您可以工作而不必担心子像素,但如果您在每个方向上只有几个或几十个像素,这可能会变得很麻烦。

解决此问题的一种方法是首先通过适当的外推增加图像大小(例如使用图像处理程序完成;cv2 模块对此充满了可能性)。然后可以将图像以单像素精度拟合在一起并进行下采样。


无论如何,您都需要一种方法来找出图像之间的最佳匹配位置。有很多选择要做。需要注意的重要一点是,您可能不想将图像与第一张图像对齐,您可能希望将所有图像与参考对齐。在这种情况下,参考可以是图像中心的完美圆圈。然后,您只需移动所有图像以匹配此参考。

选择参考后,您需要选择一种方法,该方法可以为您提供有关图像对齐的一些指标。有几种可能性,但您可以从这些开始:

  1. 计算图像的重心。

  2. 计算图像和参考之间的相关性。生成的相关数组的最高点为您提供最佳匹配。

  3. 仅在对图像进行一些处理(通常限制两端或两端的动态范围)之后执行上述任一操作。

我会这样开始:

  • 可能对图像进行上采样(如果分辨率较低)
  • 限制动态范围的高端(例如clipped=np.clip(image,0,max_intensity)
  • 计算重心(例如scipy.ndimage.measurements.center_of_mass(clipped)
  • 通过重心偏移来平移图像

二维数组的翻译需要一些代码,但应该不会太难。如果你确定你周围都是黑色的,你可以使用:

translated = np.roll(np.roll(original, deltar, axis=0), deltac, axis=1)

这会将最左边的像素向右滚动(反之亦然)。如果这很糟糕,那么您需要将它们归零。 (或者看看:python numpy roll with padding)。

关于对齐过程的警告:如果您在图像上有强度梯度,则简单(COG,相关)会失败。因此,您可能需要寻找边缘然后进行关联。如果您的背景真的很黑,那么强度限制在这里也有帮助。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多