当前位置: 首页 > article >正文

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


http://www.kler.cn/a/299589.html

相关文章:

  • 如何下载各个版本的tomcat-比如tomcat9
  • 搭建Windows下的Rust开发环境
  • 一、关系模型和关系代数,《数据库系统概念》,原书第7版
  • 永成防回水防回气装置脚踏实地老厂家
  • 信息化和精益化应当先做哪个?天行健王春城老师回答你
  • CVE-2021-4034: Suid提权pkexec本地提权漏洞
  • 【数据结构】【java】leetcode刷题记录--链表
  • 从视频中每隔10帧截取一帧并保存为图片
  • 快速幂算法
  • Origin2024中绘制多因子分组柱状图,直观展示不同组别内的数据变化!
  • ASPICE评估:提高软件开发过程质量和效率的关键步骤
  • HTTP 响应状态码详解
  • 2024/9/11 小型PLC典型应用2:伺服canlink配置、指令、应用
  • ⭐Unity 安卓环境中正确地读取和处理 XML 文件
  • 66、Python之函数高级:一个装饰器不够用,可以多装饰器buffer叠加
  • JQuery:后台接收Json串与对象
  • 828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋
  • 文件下载-前端发请求后端返回二进制文件
  • 【Linux】常见指令
  • 在WinForm中使用全局异常捕获处理