在图像处理中,当找出一个图像轮廓后,可通过轮廓矩的方法求出图像的中心点。具体步骤如下:
(1)读入图像并进行预处理;
(2)对预处理后的图像进行轮廓的绘制;
(3)通过M=cv2.moments()函数对绘制好的轮廓求矩;返回值有零阶矩(m00)、一阶矩 (m01和m10)等;
(4)求轮廓的中心点
横轴中心点(center_x, image.shape[0]//2)。
其中:center_x = int(M["m10"] / M["m00"]);因为标出中心点时,要求点坐标为整数,所以此处需取整。
M["m10"]是指关于x轴的一阶几何矩,它表示了图像区域内所有像素的x坐标之和。M["m00"]是指零阶几何矩,它表示了图像区域内的像素总数,当对图像进行二值化等预处理之后,它就表示了图像区域的面积。
image.shape[0]//2为图像轮廓高度的一半。
纵轴中心点( image.shape[1]//2,center_y )。
其中:center_y = int(M["m01"] / M["m00"]);
M["m01"]是指关于y轴的一阶几何矩,它表示了图像区域内所有像素的y坐标之和。M["m00"]同上。
image.shape[1]//2为图像轮廓宽度的一半。
下述代码可在图像上标出横轴中心点。
import cv2
import numpy as np
image = cv2.imread(img.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
contours, _ = cv2.findContours(blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contour = contours[0] # 假设只有一个轮廓
M = cv2.moments(contour)
center_x = int(M["m10"] / M["m00"])
print(center_x )
imgx_circle=cv2.circle(image, (center_x, image.shape[0]//2), 5, (0, 0, 255), -1)
imgx_resized=cv2.resize(imgx_circle, (0, 0), fx=1/2, fy=1/2)
cv2.imshow('image', imgx_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()