【OpenCV】不变矩

news2024/11/24 9:32:53

不变矩

  • 图像矩
    • 零阶矩
    • 空间矩
      • 质心
    • 中心矩
    • 归一化中心矩
    • Hu矩
  • Hu矩不变性的代码体现
    • 附录
  • 参考

图像矩

在计算图像矩是需要将图像转化为单通道的灰度图,或者进行二值化处理,即目标对象设为1,背景设为0。

图像的矩是将图像像素灰度值进行加权平均,从而反映图像中像素值分布的一种算子。

零阶矩

最简单的图像矩是以1的权重计算的像素灰度值之和,即:
m 00 = ∑ x ∑ y f ( x , y ) \begin{equation} m_{00}=\sum_x \sum_y f(x,y) \end{equation} m00=xyf(x,y)
如果要计算的是二值化图片中的一个白色对象,比如下图中的字母“S”:
二值化图片中的白色对象
通过公式可以知道,零阶矩计算的就是这个字母的像素点的个数和。因此可以推出,零阶矩只能反映图像中对象的面积信息。

至于为什么这个图像矩称为零阶矩,看完下面的空间矩就可知。

空间矩

如果在零阶矩的基础上再加上像素点的位置信息,即行数和列数,则可得到图像的空间矩:
m p q = ∑ x ∑ y x p y q f ( x , y ) \begin{equation} m_{pq}=\sum_x \sum_y x^py^qf(x,y) \end{equation} mpq=xyxpyqf(x,y)

  • 其中 ( p + q ) (p+q) (p+q)称为矩的
  • p , q = 0 p,q=0 p,q=0时,就可得到 ( 1 ) (1) (1)式中的零阶矩,这也是它为什么被称为零阶矩的原因。

空间矩又称原始矩。由于加入了行数和列数,所以相比于零阶矩,它除了可以反映对象的面积信息,还可以反映图像相对于原点(0行,0列)的位置信息,即离原点越远的灰度值,权重越高。

质心

通过 ( 2 ) (2) (2)式可以计算对象的两个一阶矩:
m 10 = ∑ x ∑ y x f ( x , y ) m_{10}=\sum_x \sum_yxf(x,y) m10=xyxf(x,y) m 01 = ∑ x ∑ y y f ( x , y ) m_{01}=\sum_x \sum_yyf(x,y) m01=xyyf(x,y)

这两个一阶矩分别代表了对象中的灰度值在行和列上的分布情况,将它们分别除以零阶矩,就可以得到行和列上的中心位置:
x ˉ = m 10 m 00 , y ˉ = m 01 m 00 \={x}=\frac{m_{10}}{m_{00}}, \={y}=\frac{m_{01}}{m_{00}} xˉ=m00m10,yˉ=m00m01
上式就是对象的质心坐标,代表了对象的中心位置。

中心矩

空间矩包含了对象相对于图像原点的位置信息;如果换成对象相对于其质心的位置信息就变成了中心矩:
μ p q = ∑ x ∑ x ( x − x ˉ ) p ( y − y ˉ ) q f ( x , y ) \begin{equation} \mu_{pq}=\sum_x \sum_x (x-\={x})^p(y-\={y})^qf(x,y) \end{equation} μpq=xx(xxˉ)p(yyˉ)qf(x,y)

由于是相对于对象自身质心的分布,所以中心矩对于对象的平移不敏感,即具有平移不变性
无论对象处于图像中的什么位置,只要形状不变,中心矩就不变。

归一化中心矩

在中心矩的基础上,再将其进行归一化,就得到了归一化的中心矩:
η p q = μ p q ( μ 00 ) γ , γ = ( p + q 2 + 1 ) \eta_{pq}=\frac{\mu_{pq}}{(\mu_{00})^\gamma}, \gamma=\left(\frac{p+q}{2}+1\right) ηpq=(μ00)γμpq,γ=(2p+q+1)

由于经过了归一化,所以该矩对于图像的缩放也不敏感了,即又具有尺度不变性
无论对象被缩放到什么尺寸,只要形状不变,归一化中心矩就不变。

Hu矩

利用归一化后的2阶或3阶中心矩可以构造出7个不变矩(Hu矩):
h u [ 0 ] = η 20 + η 02 h u [ 1 ] = ( η 20 − η 02 ) 2 + 4 η 11 3 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 ] {\small \begin{align*} hu[0] & =\eta_{20}+\eta_{02} \\ hu[1] & =(\eta_{20}-\eta_{02})^2+4\eta_{11}^3 \\ 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{align*}} hu[0]hu[1]hu[2]hu[3]hu[4]hu[5]hu[6]=η20+η02=(η20η02)2+4η113=(η303η12)2+(3η21η03)2=(η30+η12)2+(η21+η03)2=(η303η12)(η30+η12)[(η30+η12)23(η21+η03)2]+(3η21η03)(η21+η03)[3(η30+η12)2(η21+η03)2]=(η20η02)[(η30+η12)2(η21+η03)2]+4η11(η30+η12)(η21+η03)=(3η21η03)(η21+η03)[3(η30+η12)2(η21+η03)2](η303η12)(η21+η03)[3(η30+η12)2(η21+η03)2]
Hu M. K.在其1962年的论文中证明了这些矩具有旋转不变性。无论对象经过多少角度的旋转,只要形状不变,其Hu矩就不变。

但是有个例外,就是 H u [ 6 ] Hu[6] Hu[6],它在经过旋转后,符号会发生改变。

Hu矩不变性的代码体现

以下代码分别对

  • 灰度图
  • 缩小1/2后的图
  • 逆时针旋转5度的图
  • 垂直镜像后的图

计算了Hu矩,代码如下:

import cv2
import numpy as np
np.set_printoptions(suppress=True)

def my_humoments(img_gray):
    moments = cv2.moments(img_gray)
    humoments = cv2.HuMoments(moments)
    # 取对数
    humoments = np.log(np.abs(humoments))
    print(humoments)
    
if __name__=='__main__':
    fp = 'lena.jpg'
    img = cv2.imread(fp)
    img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    my_humoments(img_gray)
    
    # 缩放
    h,w = img.shape[:2]
    img = cv2.resize(img, (h//2, w//2), cv2.INTER_LINEAR)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("scale.jpg", img_gray)
    my_humoments(img_gray)
    
    # 旋转
    (h, w) = img.shape[:2]
    center = (w//2, h//2)
    M = cv2.getRotationMatrix2D(center, 5, 1.0)
    img =  cv2.warpAffine(img, M, (w, h))
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("rotate.jpg", img_gray)
    my_humoments(img_gray)
    
    # 垂直镜像
    img = cv2.flip(img, 0, dst=None)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("flip.jpg", img_gray)
    my_humoments(img_gray)

输出结果为:

变换形式 H u [ 0 ] Hu[0] Hu[0] H u [ 1 ] Hu[1] Hu[1] H u [ 2 ] Hu[2] Hu[2] H u [ 3 ] Hu[3] Hu[3] H u [ 4 ] Hu[4] Hu[4] H u [ 5 ] Hu[5] Hu[5] H u [ 6 ] Hu[6] Hu[6]
灰度图灰度图-6.62198257-18.82412227-27.47557879-25.20612238-54.72034032-34.69525116-51.54784997
缩放缩放图-6.62296285-18.82833832-27.48225177-25.21085389-54.77047947-34.70200431-51.55821672
旋转旋转-6.63267923-18.67986945-26.87920354-25.25423734-54.52139692-34.62802668-51.32178852
垂直镜像垂直镜像-6.63267923-18.67986945-26.87920354-25.25423734-54.52139692-34.62802668-51.32178852

可以看到,虽说Hu矩具有平移不变性、尺度不变性和旋转不变性,但是并不是计算出来的值都相等,只是变化非常小。

Hu矩和中心矩结合OpenCV中的轮廓检测操作可以很好地识别物体、文字的轮廓。

附录

对于二维连续函数 f ( x , y ) f(x,y) f(x,y),其 ( p + q ) (p+q) (p+q)阶的空间矩定义如下:
m p q = ∫ − ∞ + ∞ ∫ − ∞ + ∞ x p y q f ( x , y ) d x d y , p , q = 0 , 1 , 2 , ⋯ m_{pq}=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}x^py^qf(x,y) \mathrm{d} x \mathrm{d} y, p, q=0, 1,2, \cdots mpq=++xpyqf(x,y)dxdy,p,q=0,1,2,

  • 上式中的 p p p q q q可以取所有的自然数,所以 m p q m_{pq} mpq是一个空间矩的集合,且函数 f ( x , y ) f(x,y) f(x,y)只有唯一的矩的集合与之对应。
  • 参数 ( p + q ) (p+q) (p+q)称为矩的阶
  • 当阶 p + q = 0 p+q=0 p+q=0时,得到零阶矩。零阶矩的几何意义就是对象的面积: m 00 = ∫ − ∞ + ∞ ∫ − ∞ + ∞ f ( x , y ) d x d y m_{00}=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}f(x,y) \mathrm{d} x \mathrm{d} y m00=++f(x,y)dxdy
  • p = 1 , q = 0 p=1, q=0 p=1,q=0时, m 10 m_{10} m10表示对象上所有点的 x x x坐标的总和: m 10 = ∫ − ∞ + ∞ ∫ − ∞ + ∞ x f ( x , y ) d x d y m_{10}=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty} xf(x,y)\mathrm{d}x\mathrm{d}y m10=++xf(x,y)dxdy
  • p = 0 , q = 1 p=0,q=1 p=0,q=1时, m 01 m_{01} m01表示对象上所有点的 y y y坐标的总和,: m 01 = ∫ − ∞ + ∞ ∫ − ∞ + ∞ y f ( x , y ) d x d y m_{01}=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty} yf(x,y)\mathrm{d}x\mathrm{d}y m01=++yf(x,y)dxdy

中心矩 μ p q = ∫ − ∞ + ∞ ∫ − ∞ + ∞ ( x − x ˉ ) p ( y − y ˉ ) q f ( x , y ) d x d y \mu_{pq}=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty} (x-\={x})^p(y-\={y})^qf(x,y)\mathrm{d}x\mathrm{d}y μpq=++(xxˉ)p(yyˉ)qf(x,y)dxdy

参考

  1. 昊虹AI笔记,《什么叫图像或轮廓的空间矩、中心矩、归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置》
  2. AI人工智能科学,《矩、中心矩、质心、patch方向》
  3. Ming-Kuei Hu. (1962). Visual pattern recognition by moment invariants. IEEE Transactions on Information Theory, 8(2), 179–187. doi:10.1109/tit.1962.1057692
  4. 暂未成功人士!,《机器学习图像特征提取—Hu矩(Hu不变矩)原理及代码》
  5. 赵卓不凡,《一文弄懂图像的矩和相关应用》
  6. 《深度时间OCR:基于深度学习的文字识别》,机械工业出版社,2020年5月
  7. Mr2021,《Opencv:基于Hu-moments(hu矩)的形状匹配》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

62.一个机器人位于一个 m x n 网格的左上角 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。实现一个算法计算路径的数量

62. Unique Paths 题目 一个机器人位于一个 m x n 网格的左上角(在下图中标记为 ‘Start’)。 机器人每次只能向下或向右移动。机器人试图到达网格的右下角(在下图中标记为 ‘Finish’)。 问有多少条不同的路径可以到达终点? 上面是一个 7 x 3 的网格。问有多少条不同…

Spring Boot简介与体系知识导图

Spring Boot是Spring开源组织下的一个子项目,是一个基于Spring框架的快速开发脚手架,它极大地简化了Spring应用的初始化和搭建过程,为开发者提供了快速、简单的方式来开发、部署和管理Spring应用。以下是关于Spring Boot的详细介绍&#xff1…

BaseCTF Week2

Week2 Web [Week2] 一起吃豆豆 [Week2] 你听不到我的声音 无回显RCE 参考博客: BMZCTF:shell_exec_ctf exec(command:“ls >> 1.txt”)-CSDN博客RCE绕过之无回显_ctf无回显rce-CSDN博客 [Week2] ez_ser PHP反序列化。 参考博客:[h…

js发送邮件:如何在Node.js实现邮件发送?

js发送邮件如何与服务器配置?如何用nodejs发送邮件? 无论是用于用户注册确认、密码重置还是简单的通知,js发送邮件都是不可或缺的一环。AokSend将详细介绍如何在Node.js环境中实现这一功能,确保你能够轻松掌握js发送邮件的技巧。…

Android APK打包脚本

build.gradle版本 同目录创建config.gradle文件写入需要的信息入 config.gradle文件内容 ext { /*** 自定义APP运行环境* dev: 开发* test: 测试* pro: 生产*/ env "pro" /*** 动态参数配置,根据自己需要添加参数* APP_ID: 包名* VERSION_CODE: 版本号…

【Ubuntu20.04】配置深度学习环境

参考 Ubuntu20.04配置深度学习环境(全网最细最全) NVIDIA显卡驱动安装安装CUDA 通过终端nvidia-smi查看自己能安装的最高CUDA版本,在官方网址下载需要的版本。安装cuDNN 在官方网址选择适配于自己安装的CUDA版本的cuDNN安装Anaconda &#x…

Logrus IT的质量评估门户如何提高游戏本地化质量:案例研究

确保高质量的游戏本地化对于全球成功至关重要,特别是对于玩家在设置和游戏许可证上投入巨资的AAA和AA游戏。这些球员往往要求苛刻,一丝不苟。尽管客户公司通过严格控制配音人才的选拔、录音质量等,尽最大努力在所有语言中保持高标准&#xff…

Superset 连接elasticsearch

官方文档 https://superset.apache.org/docs/databases/elasticsearch/ 安装elasticsearch-dbapi库 pip install elasticsearch-dbapi 安装成功后 有账号密码填入: elasticsearchhttp://{user}:{password}{host}:9200/

时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM

时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM 文章目录 前言时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM 一、VMD-BiLSTM模型VMD-BiLSTM模型详细原理和流程1. …

顺序表和链表知识点

1 顺序表 顺序表是指用一段物理地址连续的空间去存储数据的线性结构。 顺序表有两种:静态顺序表,动态顺序表。 1.1 静态顺序表结构体定义 typedef int ElemDataSL;typedef struct SequeList {ElemDataSL arr[100];int size; }SL; 静态顺序表在创建结构体…

c++11的学习

1.初始化列表 在C98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。 struct Fun {int x;int y; }; struct Date {Date(int _year, int _month, int _day):year( _year),month(_month),day(_day){}int year 2005;int month 01;int day …

【unity实战】Cinemachine虚拟相机+Character Controller实现俯视角、第三人称角色控制,复制粘贴即用

最终效果 文章目录 最终效果一、前言二、Character Controller参数介绍三、添加虚拟相机四、2.5D俯视角人物操作五、自带重力的SimpleMove 移动六、第三人称角色控制1、移动2、添加重力3、 加地面检测,限制在地面重力不要累加3.1、自定义球形区域检测3.2、使用isGro…

MMGPL: 基于图提示学习的多模态医学数据分析 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用

Title 题目 MMGPL: Multimodal Medical Data Analysis with Graph Prompt Learning MMGPL: 基于图提示学习的多模态医学数据分析 01 文献速递介绍 神经系统疾病,包括自闭症谱系障碍(ASD)(Lord 等,2018&#xff09…

Socket【网络】

文章目录 源端口号和目的端口号端口号&&进程pid TCP协议和UDP协议网络字节序socket 接口sockaddrsocket代码 源端口号和目的端口号 端口号: 端口号是传输层协议的内容。端口号是一个2字节16位的整数。端口号用来标识一个进程,告诉操作系统&…

【SpringCloud应用框架】GateWay网关

Spring Cloud Alibaba 之初识GateWay网关 文章目录 一、网关介绍二、网关对比三、GateWay基本概念:执行流程: 总结 一、网关介绍 在微服务架构中,一个系统会被拆分为多个微服务。如果没有网关存在,我们只能在客户端记录梅哥为服务…

Windows下创建FTP服务器,实现文件共享

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 创建FTP服务器 在【启用和关闭 Windows 功能】中选中【FTP服务】【IIS管理控制台】 应用更改完成后,重启电脑。 执行 ipconfig 命令查看当前电脑…

LeetCode刷题:3.无重复字符的最长子串

问题:首先分析问题得出需求 1.要求得到一个唯一最长子串的序列的长度。 子串:依据其形式是拥有一段长度的,所以考虑滑动窗口 唯一:考虑使用HashSet 需求描述:要求得到滑动窗口的大小,也就是左右指针的距离&…

STC89C52 串口浅谈

文章目录 1. 串口1.1 串口概述1.2 串口相关概念1.3 UART1.4 STC89C52串口1.4.1 串口相关寄存器1.4.2 串口模式图 1.5 串口配置简单代码示例1.5.1 UART串口初始化1.5.2 串口中断函数模板 1. 串口 1.1 串口概述 串口(serial)是一种通讯接口,可…

如何在Mac电脑上本地部署Stable Diffusion:详细教程(webUI)

Stable Diffusion是一款强大的AI生成图像模型,它可以基于文本描述生成高质量的图像。对于想要在本地运行此模型的用户来说,使用Mac电脑部署Stable Diffusion是一个非常吸引人的选择,特别是对于M1或M2芯片的用户。本文将详细介绍如何在Mac上本…

【图像去噪】论文精读:Spatial-Adaptive Network for Single Image Denoising(SADNet)

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中…