- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算七个 Hu 不变矩。
HuMoments 函数计算七个 Hu 不变矩(引入于 [128];参见 http://en.wikipedia.org/wiki/Image_moment),定义如下:
h
u
[
0
]
=
η
20
+
η
02
h
u
[
1
]
=
(
η
20
−
η
02
)
2
+
4
η
11
2
h
u
[
2
]
=
(
η
30
−
3
η
12
)
2
+
(
3
η
21
−
η
03
)
2
h
u
[
3
]
=
(
η
30
+
η
12
)
2
+
(
η
21
+
η
03
)
2
h
u
[
4
]
=
(
η
30
−
3
η
12
)
(
η
30
+
η
12
)
[
(
η
30
+
η
12
)
2
−
3
(
η
21
+
η
03
)
2
]
+
(
3
η
21
−
η
03
)
(
η
21
+
η
03
)
[
3
(
η
30
+
η
12
)
2
−
(
η
21
+
η
03
)
2
]
h
u
[
5
]
=
(
η
20
−
η
02
)
[
(
η
30
+
η
12
)
2
−
(
η
21
+
η
03
)
2
]
+
4
η
11
(
η
30
+
η
12
)
(
η
21
+
η
03
)
h
u
[
6
]
=
(
3
η
21
−
η
03
)
(
η
21
+
η
03
)
[
3
(
η
30
+
η
12
)
2
−
(
η
21
+
η
03
)
2
]
−
(
η
30
−
3
η
12
)
(
η
21
+
η
03
)
[
3
(
η
30
+
η
12
)
2
−
(
η
21
+
η
03
)
2
]
\begin{array}{l} hu[0]= \eta _{20}+ \eta _{02} \\ hu[1]=( \eta _{20}- \eta _{02})^{2}+4 \eta _{11}^{2} \\ hu[2]=( \eta _{30}-3 \eta _{12})^{2}+ (3 \eta _{21}- \eta _{03})^{2} \\ hu[3]=( \eta _{30}+ \eta _{12})^{2}+ ( \eta _{21}+ \eta _{03})^{2} \\ hu[4]=( \eta _{30}-3 \eta _{12})( \eta _{30}+ \eta _{12})[( \eta _{30}+ \eta _{12})^{2}-3( \eta _{21}+ \eta _{03})^{2}]+(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ hu[5]=( \eta _{20}- \eta _{02})[( \eta _{30}+ \eta _{12})^{2}- ( \eta _{21}+ \eta _{03})^{2}]+4 \eta _{11}( \eta _{30}+ \eta _{12})( \eta _{21}+ \eta _{03}) \\ hu[6]=(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}]-( \eta _{30}-3 \eta _{12})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ \end{array}
hu[0]=η20+η02hu[1]=(η20−η02)2+4η112hu[2]=(η30−3η12)2+(3η21−η03)2hu[3]=(η30+η12)2+(η21+η03)2hu[4]=(η30−3η12)(η30+η12)[(η30+η12)2−3(η21+η03)2]+(3η21−η03)(η21+η03)[3(η30+η12)2−(η21+η03)2]hu[5]=(η20−η02)[(η30+η12)2−(η21+η03)2]+4η11(η30+η12)(η21+η03)hu[6]=(3η21−η03)(η21+η03)[3(η30+η12)2−(η21+η03)2]−(η30−3η12)(η21+η03)[3(η30+η12)2−(η21+η03)2]
其中
η
j
i
\eta_{ji}
ηji代表
Moments::nu
j
i
\texttt{Moments::nu}_{ji}
Moments::nuji。
这些值被证明对于图像的尺度、旋转和平面反射是不变的,除了第七个值,其符号会因平面反射而改变。这种不变性是在假定图像具有无限分辨率的情况下被证明的。对于位图图像(raster images),原始图像和变换后的图像所计算得到的 Hu 不变矩会略有不同。
HuMoments 函数是 OpenCV 提供的一种用于计算 Hu 矩的方法。Hu 矩是一种不变矩,即它们对平移、旋转和尺度变化具有不变性。这种特性使得 Hu 矩在图像识别和模式匹配中非常有用,尤其是在处理形状识别任务时。
Hu 矩是一种特殊的图像矩,它是由数学家M. K. Hu在1962年提出的。Hu 矩主要用于图像分析和模式识别领域,特别是用于形状描述和识别。Hu 矩的一个重要特性是它们对于图像的平移、旋转和尺度变换具有不变性,也就是说,即使图像发生了这些变换,Hu 矩的值仍然保持不变(除了第七个矩在图像反射时符号会发生改变)。
Hu 矩的特点
- 平移不变性:图像无论在图像平面上移动到哪个位置,其Hu矩都保持不变。
- 旋转不变性:图像绕其中心旋转任意角度,其Hu矩也保持不变。
- 尺度不变性:图像放大或缩小,其Hu矩仍然保持不变。
- 部分反射不变性:前六个Hu矩在图像发生平面反射时保持不变,第七个矩的符号会改变。
Hu 矩的应用
Hu 矩因其不变性的特性,在计算机视觉和模式识别中有着广泛的应用,比如:
- 形状识别:通过比较不同物体的Hu矩,可以用来识别相似形状的物体。
- 物体检测:在图像处理中,可以利用Hu矩来检测特定形状的物体。
- 手写字符识别:Hu矩可以用来识别手写字符,尤其是当手写字符可能被旋转或缩放时。
- 目标跟踪:在视频序列中,可以利用Hu矩来跟踪具有特定形状的目标。
函数原型1
void cv::HuMoments
(
const Moments & m,
OutputArray hu
)
参数1
- 参数moments 使用 moments 函数计算的输入矩。
- 参数hu 输出的 Hu 不变矩。
函数原型2
原型1函数的重载,只是参数类型不同。
void cv::HuMoments
(
const Moments & m,
OutputArray hu
)
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 加载图像
Mat img = imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", IMREAD_GRAYSCALE );
if ( img.empty() )
{
cerr << "Error: Image cannot be loaded!" << endl;
return -1;
}
// 计算图像的矩
Moments m = moments( img );
// 计算 Hu 矩
vector< double > huMoments( 7 );
HuMoments( m, huMoments );
// 归一化 Hu 矩
cv::HuMoments( m, huMoments );
// 打印 Hu 矩
cout << "Normalized Hu Moments:" << endl;
for ( size_t i = 0; i < huMoments.size(); ++i )
{
cout << "hu[" << i << "] = " << huMoments[ i ] << endl;
}
return 0;
}
运行结果
Normalized Hu Moments:
hu[0] = 0.00078302
hu[1] = 8.89733e-08
hu[2] = 4.22269e-14
hu[3] = 1.15024e-13
hu[4] = 5.64602e-27
hu[5] = 3.02133e-17
hu[6] = 5.69069e-27