OpenCV结构分析与形状描述符(15)计算 Hu 矩的函数HuMoments()的使用

  • 操作系统: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]=(η303η12)2+(3η21η03)2hu[3]=(η30+η12)2+(η21+η03)2hu[4]=(η303η12)(η30+η12)[(η30+η12)23(η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](η303η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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值