Hu矩原理 | cv2中基于Hu矩计算图像轮廓相似度差异的函数cv2.matchShapes【小白记笔记】

Hu 矩(Hu Moments) 是一种用于描述轮廓形状的 不变特征。它基于图像的矩提取,经过数学变换得到 7 个不变矩,这些不变矩在图像 平移、旋转和缩放等几何变换下保持不变,适合用来衡量轮廓或形状的相似度差异。

1、图像矩的定义

M p q = ∑ x ∑ y x p y q f ( x , y ) M_{pq}=\sum_x \sum_y x^p y^q f(x,y) Mpq=xyxpyqf(x,y)
p和q表示矩的阶数,f(x,y)是图像在坐标(x,y)处的像素值。
零阶矩 M 00 M_{00} M00 表示图像的灰度总和(图像的总质量,对二值图像来说是前景像素的总数)。
一阶矩 M 10 M_{10} M10 M 01 M_{01} M01 表示图像的中心坐标。

中心矩:将图像的重心作为坐标原点(消除图像平移的影响)
μ p q = ∑ x ∑ y ( x − x ˉ ) p ( y − y ˉ ) q f ( x , y ) \mu_{p q}=\sum_x \sum_y(x-\bar{x})^p(y-\bar{y})^q f(x, y) μpq=xy(xxˉ)p(yyˉ)qf(x,y)
x ˉ = M 10 M 00 , y ˉ = M 01 M 00 \bar{x}=\frac{M_{10}}{M_{00}}, \bar{y}=\frac{M_{01}}{M_{00}} xˉ=M00M10,yˉ=M00M01 为图像的重心坐标

归一化中心距:将中心矩归一化(消除图像缩放的影响)
η p q = μ p q μ 00 γ , γ = p + q 2 + 1 \eta_{p q}=\frac{\mu_{p q}}{\mu_{00}^\gamma}, \quad \gamma=\frac{p+q}{2}+1 ηpq=μ00γμpq,γ=2p+q+1

2、Hu矩

Hu矩是基于归一化中心矩计算的7个不变矩,在平移、旋转和缩放下保持不变的特征,公式为
在这里插入图片描述

3、cv2中基于Hu矩计算图像轮廓相似度差异的函数cv2.matchShapes

cv2中的函数matchShapes是基于Hu矩计算的。

cv2中的函数是:

double Cv2.MatchShapes(Mat contour1, Mat contour2, ContourMatchModes method, double parameter = 0);

contour1contour2是输入的两个轮廓,通常由cv2.FindContours()获得。method为计算相似度的方法,ContourMatchModes.I1为基于 Hu 矩的倒数进行比较,还可以选择参数ContourMatchModes.I2ContourMatchModes.I3

method采用ContourMatchModes.I1 时具体计算公式为:
d = ∑ i = 1 7 ∣ 1 H u 1 i − 1 H u 2 i ∣ d=\sum_{i=1}^7\left|\frac{1}{\mathrm{Hu}1_i}-\frac{1}{\mathrm{Hu} 2_i}\right| d=i=17 Hu1i1Hu2i1
Hu1 和 Hu2 分别表示两个形状的各阶矩。值越小,表示两个形状的Hu矩越接近,两个形状的特征越接近,两个形状越相似。

完整代码:

import cv2
import numpy as np
from scipy.spatial.distance import directed_hausdorffdef calculate_contour_similarity(img1_path, img2_path, threshold=128):# 读两种灰度图img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 转化成二值图_, binary1 = cv2.threshold(img1, threshold, 255, cv2.THRESH_BINARY)_, binary2 = cv2.threshold(img2, threshold, 255, cv2.THRESH_BINARY)# 边缘检测_, contours1, _ = cv2.findContours(binary1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)_, contours2, _ = cv2.findContours(binary2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 保存两张检测处边缘的图像,为了让图中显示的边缘是彩色的,需要将灰度图转化成彩色图color_image1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)color_image2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)# (0, 0, 255)红色,2代表显示轮廓的宽度cv2.drawContours(color_image1, contours1, -1, (0, 0, 255), 2)cv2.drawContours(color_image2, contours2, -1, (0, 0, 255), 2)cv2.imwrite('./contour/img11.jpg', color_image1) # 保存文件夹中,也可以cv2.imshow就不用保存了cv2.imwrite('./contour/img22.jpg', color_image2)# 图像中可能有多个轮廓,选最大的一个contour1 = max(contours1, key=cv2.contourArea)contour2 = max(contours2, key=cv2.contourArea)similarity = cv2.matchShapes(contour1, contour2, cv2.CONTOURS_MATCH_I1, 0.0)return similarityimage1_path = "./11.png"
image2_path = "./22.png"# 调用写好的方法
similarity_match_shapes = calculate_contour_similarity(image1_path, image2_path)print(similarity_match_shapes)

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

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

相关文章

计算无人机俯拍图像的地面采样距离(GSD)矩阵

引言 在无人机遥感、测绘和精细农业等领域,地面采样距离(Ground Sampling Distance,简称 GSD)是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离,通常以米或厘米为单位。GSD 决定了图像的空间…

浅谈怎样系统的准备前端面试

前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…

深度学习-74-大语言模型LLM之基于API与llama.cpp启动的模型进行交互

文章目录 1 大模型量化方法1.1 GPTQ(后训练量化)1.2 GGUF(支持CPU)1.3 AWQ(后训练量化)2 llama.cpp2.1 功能2.1.1 Chat(聊天)2.1.2 Completion(补全)2.2 运行开源LLM2.2.1 下载安装llama.cpp2.2.2 下载gguf格式的模型2.2.3 运行大模型3 API访问3.1 调用补全3.2 调用聊天3.3 提取…

sql server 字符集和排序

英文: Latin1_General_CI_AS 中文:Chinese_PRC_CI_AS 影响字符存储,解释用户存在单字节字符类型(char,varchar等)里面的数据 字符排序规则(是否区分大小写等) 中国的用户一定要注意…

【docker】列出与特定镜像名相关的镜像

目录 1. 说明2. 列出所有镜像3. 使用镜像名过滤4. 列出特定标签的镜像5. 结合多个过滤条件6. 使用 JSON 格式和 jq 工具 1. 说明 1.在 Docker 中,如果你想列出与特定镜像名相关的镜像,可以使用 docker images 命令并结合过滤选项(如 --filte…

Elasticsearch 实战应用:开启数据搜索与分析新征程

在当今信息爆炸的时代,高效的数据搜索与分析能力成为众多企业和开发者追求的目标。Elasticsearch 作为一款强大的分布式搜索和分析引擎,正逐渐成为数据处理领域的核心工具之一。在我们的教学过程中,旨在让学生深入理解并熟练掌握 Elasticsear…

Navicat 17 功能简介 | SQL 美化

SQL美化 本期,我们将深入挖掘 Navicat 的实用的SQL代码美化功能。你只需简单地点击“SQL 美化”按钮,即可轻松完成 SQL 的格式化。 随着 17 版本的发布,Navicat 也带来了众多的新特性,包括兼容更多数据库、全新的模型设计、可视化…

2009 ~ 2019 年 408【数据结构】大题解析

2009 年 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 1. 图的应用(10’) 带权图(权值非负, 表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间…

时空AI赋能低空智能科技创新

随着人工智能技术的不断进步,时空人工智能(Spatio-Temporal AI,简称时空AI)正在逐渐成为推动低空经济发展的新引擎。时空AI结合了地理空间智能、城市空间智能和时空大数据智能,为低空智能科技创新提供了强大的数据支持…

SamOut 任意长度推理空间不变

项目地址 import numpy as np import pandas as pd import torch from tqdm import tqdmfrom infer_model import SamOutdef load_model_and_voc(device"cpu"):voc pd.read_pickle("total_voc.pkl")net SamOut(len(voc["voc"]), 1024 512, 64…

17.springcloud_openfeign之扩展组件一

文章目录 一、前言二、默认约定配置FeignAutoConfigurationCachingCapabilityFeignCachingInvocationHandlerFactoryFeignJacksonConfiguration熔断器配置FeignCircuitBreakerTargeterFeignCircuitBreaker.Builder FeignClientsConfigurationCircuitBreakerFactory 总结 一、前…

Python读取Excel批量写入到PPT生成词卡

一、问题的提出 有网友想把Excel表中的三列数据,分别是:单词、音标和释义分别写入到PPT当中,每一张PPT写一个单词的内容。这种批量操作是python的强项,尤其是在办公领域,它能较好地解放双手,读取Excel表后…

Proteus(8.15)仿真下载安装过程(附详细安装过程图)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么? 二、下载链接 三、下安装步骤 1.解压,有键管理员运行 2.点击Next,进行下一步 3.勾选I accept…&#…

防止私接小路由器

电脑获取到IP地址不是DHCP服务器的IP地址段,导致整个公司网络瘫痪,这些故障现象通常80%原因是私接小路由器导致的,以下防止私接小路由器措施。 一、交换机配置DHCP Sooping DHCP snooping是一种DHCP安全特性,用于防止非法设备获…

动态导出word文件支持转pdf

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、功能说明二、使用步骤1.controller2.工具类 DocumentUtil 导出样式 前言 提示:这里可以添加本文要记录的大概内容: 例如&#xff…

紧固件设计之——开槽六角头防脱出杆螺栓仿真APP

按照产品形态分类,紧固件通常包括以下12类:螺栓、螺柱、螺钉、螺母、自攻螺钉、木螺钉、垫圈、挡圈、销、铆钉、焊钉、组合件与连接副,是一类用于连接和固定各种构件和零部件的重要机械零件,可确保机械装置或设备结构的牢固和稳定…

【Python装饰器】编写一个装饰器,并将其放到适当的位置,目的是让代码 1 秒钟打印一个结果

import timedef fib():back1, back2 0, 1def func():nonlocal back1, back2back1, back2 back2, back1 back2print(back1, end )return funcdef get_fib(n):f fib()for i in range(n):f()n int(input("请输入需要获取的斐波那契数:"))get_fib(n) imp…

mysql中与并发相关的问题?

今天我们来聊聊 MySQL 中与并发相关的一些问题。作为一名资深 Python 开发工程师,我觉得这些问题不仅关乎数据库的稳定性和数据的一致性,更与我们的代码实现和业务逻辑密切相关。 尤其是在高并发环境下,如何保证数据的一致性,如何…

【Mac】安装 PaddleOCR

环境:Mac M1 芯片 1、安装 Anaconda 安装较为简单,直接在 Anaconda 官网 下载pkg文件,根据向导提示完成安装。 Anaconda 用于搭建 Python 虚拟环境,目的是为了避免与之前环境安装库的版本冲突,另外 paddle 对Python…

使用k6进行kafka负载测试

1.安装环境 kafka环境 参考Docker搭建kafka环境-CSDN博客 xk6-kafka环境 ./xk6 build --with github.com/mostafa/xk6-kafkalatest 查看安装情况 2.编写脚本 test_kafka.js // Either import the module object import * as kafka from "k6/x/kafka";// Or in…