如何在OpenCV Python中计算图像的Hu矩?

如何在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()

为了更好地理解,让我们看一些示例。

我们将在以下示例中使用以下图像作为 输入文件

如何在OpenCV Python中计算图像的Hu矩?

示例 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]]

并且我们得到以下输出窗口,显示图像中检测到的第一个轮廓

如何在OpenCV Python中计算图像的Hu矩?

示例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]]

我们得到以下输出窗口,显示图像中检测到的轮廓−

如何在OpenCV Python中计算图像的Hu矩?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV