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=∑x∑yxpyqf(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=∑x∑y(x−xˉ)p(y−yˉ)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中的函数是:

python 复制代码
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 Hu1i1−Hu2i1

Hu1 和 Hu2 分别表示两个形状的各阶矩。值越小,表示两个形状的Hu矩越接近,两个形状的特征越接近,两个形状越相似。

完整代码:

python 复制代码
import cv2
import numpy as np
from scipy.spatial.distance import directed_hausdorff


def 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 similarity

image1_path = "./11.png"
image2_path = "./22.png"

# 调用写好的方法
similarity_match_shapes = calculate_contour_similarity(image1_path, image2_path)

print(similarity_match_shapes)
相关推荐
bing.shao1 分钟前
Golang 开发者视角:解读《“人工智能 + 制造” 专项行动》的技术落地机遇
人工智能·golang·制造
LOnghas12111 分钟前
玉米目标检测实战:基于YOLO13-C3k2-RFAConv的优化方案_1
人工智能·目标检测·计算机视觉
量子-Alex11 分钟前
【大模型课程笔记】斯坦福大学CS336 课程环境配置与讲座生成完整指南
人工智能·笔记
冬奇Lab15 分钟前
一天一个开源项目(第9篇):NexaSDK - 跨平台设备端 AI 运行时,让前沿模型在本地运行
人工智能·开源
量子-Alex26 分钟前
【大模型技术报告】Qwen2-VL大模型训练过程理解
人工智能
java1234_小锋32 分钟前
【AI大模型舆情分析】微博舆情分析可视化系统(pytorch2+基于BERT大模型训练微调+flask+pandas+echarts) 实战(上)
人工智能·flask·大模型·bert
新缸中之脑33 分钟前
Imagerouter.io: 免费图像生成API
人工智能
MM_MS37 分钟前
Halcon图像点运算、获取直方图、直方图均衡化
图像处理·人工智能·算法·目标检测·计算机视觉·c#·视觉检测
阿杰学AI38 分钟前
AI核心知识77——大语言模型之Joint Training(简洁且通俗易懂版)
人工智能·深度学习·ai·语言模型·rag·联合训练·joint training
DFT计算杂谈38 分钟前
VASP+PHONOPY+pypolymlpj计算不同温度下声子谱,附批处理脚本
java·前端·数据库·人工智能·python