对齐数组值

2024-06-07 04:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个数组,都有代表太阳亮度的值。第一个数组在早上测量值,第二个数组在晚上测量值。在实际情况下,我有大约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中的有效值对齐?所以结果应该是这样的。在

^{pr2}$

为了以有意义的方式对数组进行后处理,例如计算平均值或求和等等。注意!找到一个质心点并相应地对齐是行不通的,因为边上的值可能在一天中发生变化。在


Tags: 图像亮点地球matplotlib绘制情况图片代表
1条回答
网友
1楼 · 发布于 2024-06-07 04:17:28

这类数据可能导致问题的一个原因是图像与像素没有很好地对齐。我试图用两个方阵来说明我的观点:

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很容易,而且第一个数组的COG是(row,column=2,2),第二个数组是(2,2.5)。但是如果我们将第二个数组向左移动0.5,我们得到:

^{pr2}$

这样事情就开始扩散了。在

当然,可能是因为你的数组足够大,你可以不用担心子像素,但是如果你在每个方向上只有几个或几十个像素,这可能会成为一个麻烦。在

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


在任何情况下,您都需要一种方法来找出图像之间的最佳匹配。有很多选择要做。需要注意的一点是,您可能不希望将图像与第一个图像对齐,而是希望将所有图像与引用对齐。在这种情况下,参考可以是图像中心的一个完美圆。然后你只需要移动所有的图像来匹配这个引用。在

一旦你选择了你的参考,你需要选择一种方法,它能给你一些关于图像对齐的度量。有几种可能性,但您可以从以下几个方面着手:

  1. 计算图像的重心。

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

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

我会从以下几点开始:

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

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

^{3}$

这会将最左边的像素向右滚动(反之亦然)。如果不好的话,你需要把它们归零。(或者看看:python numpy roll with padding)。在

关于对齐过程的一句警告:如果图像上有一个强度梯度,那么simples(COG,correlation)将失败。因此,您可能需要查找边,然后进行关联。如果你的背景是黑色的,那么强度限制也有帮助。在

相关问题 更多 >