如何将一阶图像矩m01、m10置零以实现Zernike矩平移不变性?实操困惑
Zernike矩平移不变性实现的疑问与理解误区
论文《Invariant image recognition by Zernike moments》指出:“平移不变性可通过将图像转换为一阶矩m01和m10均为零的新图像来实现。具体做法是将原始图像f(x,y)转换为f(x+X, y+J),其中X和J是由原始矩M10、M01和M00计算得到的原始图像质心位置。换句话说,在计算矩之前将原点移至质心。”
我在9x9的零数组中绘制了一个3x3的全1方块:
[0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 1. 1. 0. 0. 0. 0. 0. 0.] [1. 1. 1. 0. 0. 0. 0. 0. 0.] [1. 1. 1. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.]
计算得到矩:M00=9.0,M10=9.0,M01=27.0,因此质心(x,y)=(1.0,3.0)。
我尝试将形状沿x方向平移+1、y方向平移+3,得到变换后的图像:
[0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 1. 1. 1. 0. 0. 0.] [0. 0. 0. 1. 1. 1. 0. 0. 0.] [0. 0. 0. 1. 1. 1. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0.]
计算变换后图像的矩:M00=9.0,M10=36.0,M01=36.0,质心(x,y)=(4.0,4.0)。
结果中M10和M01相等但不为零,且目标已位于数组中心。我意识到只有图像中无像素时M10或M01才会为零,因为M10是所有f(x,y)=1处x坐标的总和,M01是对应y坐标的总和。
现在有两个疑问:
- 如果对图像集中的每张图像都应用此流程,即使矩未归零,是否已正确完成归一化?
- 若未正确归一化,我在理解论文方法时存在哪些误区?
演示代码
import numpy as np import cv2 image = np.zeros([9,9]) image[2,0] = 1 image[3,0] = 1 image[4,0] = 1 image[2,1] = 1 image[3,1] = 1 image[4,1] = 1 image[2,2] = 1 image[3,2] = 1 image[4,2] = 1 print(image) M = cv2.moments(image) m00 = M['m00'] m10 = M['m10'] m01 = M['m01'] x = m10 / m00 y = m01 / m00 print(M) print(f"centroid is {x},{y}") image_2 = np.zeros([9,9]) image_2[3,3] = 1 image_2[4,3] = 1 image_2[5,3] = 1 image_2[3,4] = 1 image_2[4,4] = 1 image_2[5,4] = 1 image_2[3,5] = 1 image_2[4,5] = 1 image_2[5,5] = 1 print(image_2) M = cv2.moments(image_2) m00 = M['m00'] m10 = M['m10'] m01 = M['m01'] x = m10 / m00 y = m01 / m00 print(M) print(f"centroid is {x},{y}")
内容的提问来源于stack exchange,提问作者ORead15
相关产品推荐
相关产品推荐

