如何在OpenCV Python中计算图像的Hu矩?
可以使用 cv2.HuMoments() 函数来找到 Hu 矩,它返回对平移、旋转和缩放不变的七个矩。第七个矩是偏移不变的。
为计算 Hu 矩,我们需要先找到图像。使用对象轮廓计算对象的图像矩。因此,首先,我们检测对象的轮廓,然后应用 cv2.moments() 函数来计算矩。
语法
使用以下语法来调用该函数 −
M = cv2.moments(cnt)
cv2.HuMoments(M)
在此,
- cnt - 是图像中对象轮廓点的 NumPy 数组。
-
M - 上面计算的图像矩。
步骤
您可以使用以下步骤计算图像中的 Hu 矩 –
导入所需的库。 在所有以下 Python 示例中,所需的 Python 库是 OpenCV。请确保您已经安装了它。
import cv2
使用 cv2.imread() 方法读取输入图像并将其转换为灰度图像。
img = cv2.imread('shape.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
对灰度图像进行阈值处理以创建二元图像。
ret,thresh = cv2.threshold(gray,150,255,0)
使用 cv2.findContours() 函数在图像中查找轮廓。
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
使用 cv2.moments(cnt) 函数计算轮廓的矩。
cnt = contours[0]
M = cv2.moments(cnt)
使用 cv2.HuMoments(M) 函数为特定轮廓找出 Hu 矩。
Hm = cv2.HuMoments(M)
在输入图像上绘制轮廓。
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
输出 Hu 矩并显示带有绘制轮廓的图像。
print("第一个轮廓的 Hu 矩:\n", Hm)
cv2.imshow(Hu-Moments", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
为了更好地理解,让我们看一些示例。
我们将在以下示例中使用以下图像作为 输入文件 。
示例 1
在以下 Python 程序中,我们检测图像中的轮廓,并为第一个轮廓找到 Hu 矩。我们还在图像上绘制第一个轮廓。
# 导入所需的库
import cv2
# 读取输入图像
img = cv2.imread('shape.png')
# 将输入图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 在灰度图像上应用二值化
ret,thresh = cv2.threshold(gray,150,255,0)
# 在图像中寻找轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓数:" ,len(contours))
# 找到第一个轮廓的矩
cnt = contours[0]
M = cv2.moments(cnt)
Hm = cv2.HuMoments(M)
# 绘制轮廓
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
x1, y1 = cnt[0,0]
cv2.putText(img, '轮廓:1', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
# 打印第一个轮廓的矩
print("第一个轮廓的Hu矩:\n", Hm)
cv2.imshow("Hu-Moments", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当您执行上面的代码时,它将产生以下输出 −
检测到的轮廓数:3
第一个轮廓的Hu矩:
[[ 1.59307685e-01]
[ 4.69721864e-05]
[ 1.89651880e-10]
[ 8.95011994e-14]
[ 2.03401550e-25]
[ 4.24017740e-16]
[-3.07567885e-25]]
并且我们得到以下输出窗口,显示图像中检测到的第一个轮廓
示例2
在下面的Python程序中,我们检测图像中的轮廓,并找到所有轮廓的Hu矩。 我们还在图像上绘制所有轮廓。
import cv2
import numpy as np
img = cv2.imread('shape.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,170,255,0)
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("Number of contours detected:",len(contours))
# 计算图像中检测到的所有轮廓的Hu不变矩
for i, cnt in enumerate(contours):
x,y = cnt[0,0]
moments = cv2.moments(cnt)
hm = cv2.HuMoments(moments)
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.putText(img, f'Contour {i+1}', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 0), 2)
print(f"\n轮廓{i+1}: 的 Hu不变矩:\n", hm)
cv2.imshow("Hu-Moments", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当您执行上述代码时,它将生成以下输出−
检测到的轮廓数:3
第1个轮廓的Hu不变矩:
[[ 1.59307685e-01]
[ 4.69721864e-05]
[ 1.89651880e-10]
[ 8.95011994e-14]
[ 2.03401550e-25]
[ 4.24017740e-16]
[-3.07567885e-25]]
第2个轮廓的Hu不变矩:
[[ 1.67576439e-01]
[ 3.03541843e-04]
[ 2.96933966e-10]
[ 8.49276231e-12]
[-3.47095391e-22]
[ 2.67821989e-14]
[ 2.47818355e-22]]
第3个轮廓的Hu不变矩:
[[2.29748674e-01]
[1.57527336e-02]
[5.92081089e-03]
[4.77994195e-04]
[4.24175667e-07]
[1.65030169e-05]
[6.83150707e-07]]
我们得到以下输出窗口,显示图像中检测到的轮廓−