【问题标题】:targeting center of mass - scipy / numpy瞄准质心 - scipy / numpy
【发布时间】:2018-04-01 05:09:53
【问题描述】:

鉴于以下情况:

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中寻找欧几里得距离最小的点并以它为中心切片?
  • 这将有无限数量的没有约束的解决方案。
  • 好的,让我澄清一下问题的约束

标签: python numpy image-processing scipy linear-algebra


【解决方案1】:

很容易:

  1. 找到几何中心

    import numpy as np
    
    c1 = center_of_mass(np.ones_like(A))
    #or : c1 = [A.shape[0]/2.,A.shape[1]/2.]
    
  2. 通过差异移位矩阵

    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]])

【讨论】:

  • roll只会为整数工作,当质量中心位于子像素值时有没有办法做到这一点? span>
  • @ cocious_cosmo。您是否熟悉图像重新采样? span>
  • 我必须添加int函数来获取答案。 S = np.roll(A, int(c1[0] - cm[0]), axis=0)之后我得到了所需的矩阵。显然,阵列需要整数格式或切片索引的@ 987654327方法。我理解这里没有适当的方法丢失了一些清晰度 - 即。获得确切的解决方案 - 所以任何进一步的帮助如何做到这一点。 span>
猜你喜欢
  • 2015-10-12
  • 2016-11-28
  • 2020-04-20
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2011-07-26
相关资源
最近更新 更多