寻找如何使用图像处理工具“描述”任何类型的图像和形状的示例,我偶然发现了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)与着名的第二个中心时刻相关的价值是什么?
答案 0 :(得分:2)
measure.moments_central
返回的数组对应https://en.wikipedia.org/wiki/Image_moment的公式(中心时刻)。 mu_00确实对应于对象的区域。
惯性矩阵并不总是对称的,如此示例所示,其中对象是矩形而不是正方形。
>>> 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解释了如何使用二阶矩来计算对象的方向。