瞄准质心 - scipy / numpy

3

以下是给定内容:

from scipy.ndimage import center_of_mass
from numpy import array

A = array([
  [ 255, 255, 0, 0 ]
  [ 255, 255, 0, 0 ],
  [ 0   , 0,  0, 0 ],
  [ 0   , 0,  0, 0 ]
])

cm = center_of_mass(A)
# cm = (0.5, 0.5)

centered = ???
cmc = center_of_mass(centered)
# cmc ~= (1.5,1.5)

我们如何将这个ndarray / 图像移动,使其以重心为中心呢?

我们的目标结果如下:

centered = array([
  [ 0,   0,   0, 0 ],
  [ 0, 255, 255, 0 ],
  [ 0, 255, 255, 0 ],
  [ 0,   0,   0, 0 ]
])

寻找距离cm最近的点,并以此为中心切割? - Divakar
这将在没有约束条件的情况下拥有无限数量的解。 - Psidom
好的,让我就限制条件给这个问题添加一些澄清。 - datavoredan
1个回答

4

很简单:

  1. find the geometrical center

    import numpy as np
    
    c1 = center_of_mass(np.ones_like(A))
    #or : c1 = [A.shape[0]/2.,A.shape[1]/2.]
    
  2. shift the matrix by the diffrenence

    S = np.roll(A, c1[0]-cm[0] , axis=0)
    S = np.roll(S, c1[0]-cm[0] , axis=1)
    

答案将是:

    Out[18]: 
    array([[  0,   0,   0,   0],
           [  0, 255, 255,   0],
           [  0, 255, 255,   0],
           [  0,   0,   0,   0]])

1
由于“roll”仅适用于整数,当质心位于亚像素值时是否有方法可以实现此操作? - curious_cosmo
@curious_cosmo。你熟悉图像重采样吗? - Mad Physicist
我不得不添加一个int函数来获得答案。 S = np.roll(A, int(c1[0] - cm[0]), axis=0) 然后我得到了想要的矩阵。显然,数组需要整数格式或切片索引的__index__方法。我理解在没有适当的方法(即获得精确解)的情况下,这里会失去一些清晰度,所以如果需要进一步帮助,请随时提出。 - double0darbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接