DigitalMicrograph 中的 CreateImage 错误 (python)

CreateImage Bug in DigitalMicrograph (python)

我在尝试使用 python 在 DigitalMicrograph 中创建图像时似乎遇到了一个非常奇怪的错误。简而言之,我定义了一个包含 32 个 x 和 y 坐标的数组,然后将其重新整形为 2x4x4 矩阵。创建图像时,DM 会在 x 平面中交替绘制 x 和 y 坐标。我认为最好用这个 MWE 来描述:

import numpy as np

num1 = np.arange(32.)
num1 = num1.reshape((2,4,4))
print(f'num1: {num1}')


num2 = np.zeros((16,2))
for i in range(16):
    num2[i, :] = i, i+16
num2 = num2.reshape((4,4,2))
num2 = np.copy(np.transpose(num2, (2, 0, 1)))
print(f'num2: {num2}')

print(f"Are the arrays equal? {np.array_equal(num1, num2)}" )

print(f'num1 shape: {num1.shape}')
print(f'num2 shape: {num2.shape}')

img1 = DM.CreateImage(np.copy(num1))
img1.ShowImage()

img2 = DM.CreateImage(np.copy(num2))
img2.ShowImage()

del img1
del img2

num2 演示了错误 - 条纹在图像中可见。 DM 在 x 平面 (1x4x4) 中绘制第一个 x 坐标,然后绘制第一个 y 坐标,并继续交替,直到所有位置都被填满。如果我从此图像中获取数组,则生成的数组与我传递给 CreateImage 函数的数组不同。

相比之下,num1 创建了 完全相同的 原始数组,传递给相同的函数,但按预期绘制。

脚本输出为:

num1: [[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]
  [12. 13. 14. 15.]]

 [[16. 17. 18. 19.]
  [20. 21. 22. 23.]
  [24. 25. 26. 27.]
  [28. 29. 30. 31.]]]
num2: [[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]
  [12. 13. 14. 15.]]

 [[16. 17. 18. 19.]
  [20. 21. 22. 23.]
  [24. 25. 26. 27.]
  [28. 29. 30. 31.]]]
Are the arrays equal? True
num1 shape: (2, 4, 4)
num2 shape: (2, 4, 4)

可能是内存问题?还有其他人遇到过这个吗?

您遇到的问题是由 Numpy copy 命令引起的。 从documentation可以看出,它默认使用'K'参数:

‘K’ means match the layout of a as closely as possible.

内存布局在 Python 脚本中(似乎)无关紧要,但在创建映射到同一连续内存部分的 DM 图像时它肯定很重要。

这就是为什么首先需要 copy 的原因。

如果替换

img1 = DM.CreateImage(np.copy(num1))
img1.ShowImage()

img2 = DM.CreateImage(np.copy(num2))
img2.ShowImage()

img1 = DM.CreateImage(np.copy(num1, order = 'C'))
img1.ShowImage()

img2 = DM.CreateImage(np.copy(num2, order = 'C'))
img2.ShowImage()

事情已经解决了。 (命令 'A' 在这种情况下似乎也有效。)