Scikit-image和中心时刻:意义是什么?

时间:2016-08-08 16:42:10

标签: python image-processing canopy scikit-image

寻找如何使用图像处理工具“描述”任何类型的图像和形状的示例,我偶然发现了Scikit-image skimage.measure.moments_central(image, cr, cc, order=3)函数。

他们举了一个如何使用这个函数的例子:

from skimage import measure #Package name in Enthought Canopy
import numpy as np

image = np.zeros((20, 20), dtype=np.double) #Square image of zeros
image[13:17, 13:17] = 1 #Adding a square of 1s
m = moments(image)
cr = m[0, 1] / m[0, 0] #Row of the centroid (x coordinate)
cc = m[1, 0] / m[0, 0] #Column of the centroid (y coordinate)

In[1]: moments_central(image, cr, cc)
Out[1]:
array([[ 16.,   0.,  20.,   0.],
       [  0.,   0.,   0.,   0.],
       [ 20.,   0.,  25.,   0.],
       [  0.,   0.,   0.,   0.]])

1)每个值代表什么?由于(0,0)元素是16,我得到的这个数字对应于1的平方区域,因此它是mu零 - 零。但其他人呢?

2)这总是一个对称矩阵吗?

3)与着名的第二个中心时刻相关的价值是什么?

1 个答案:

答案 0 :(得分:2)

measure.moments_central返回的数组对应https://en.wikipedia.org/wiki/Image_moment的公式(中心时刻)。 mu_00确实对应于对象的区域。

Formula from Wikipedia (Image moment)

惯性矩阵并不总是对称的,如此示例所示,其中对象是矩形而不是正方形。

>>> image = np.zeros((20, 20), dtype=np.double) #Square image of zeros
>>> image[14:16, 13:17] = 1
>>> m = measure.moments(image)
>>> cr = m[0, 1] / m[0, 0]
>>> cc = m[1, 0] / m[0, 0]
>>> measure.moments_central(image, cr, cc)
array([[  8. ,   0. ,   2. ,   0. ],
       [  0. ,   0. ,   0. ,   0. ],
       [ 10. ,   0. ,   2.5,   0. ],
       [  0. ,   0. ,   0. ,   0. ]])

对于二阶矩,它们是mu_02,mu_11和mu_20(对角线上的系数i + j = 1)。同一维基百科页面https://en.wikipedia.org/wiki/Image_moment解释了如何使用二阶矩来计算对象的方向。