27-图像的矩(EmguCV学习)

17- OpenCV:图像矩(Image Moments)和点多边形测试 主要介绍图像矩和点多边形测试的含义,以及相关api,和如何使用(有具体代码演示) 阅读详情

图像普通矩

1、矩函数在图像分析中有着广泛的应用;一个从数字图像中提取出来的矩集,通常描述了该图像形状的全局特征,并提供了大量的关于该图像不同类型的几何特征信息,比如大小、位置、方向、形状等。一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩是关于平均值的对称性的测量。
2、由图像二阶矩与三阶矩可以导出7个不变矩,不变矩是图像的统计特征,满足平移,伸缩,旋转不变性, 在图像识别领域具有广泛的应用;
3、轮廓矩代表一条轮廓、一幅图像、一组点集的某些高级特征,矩的数值定义:
在这里插入图片描述

M p , q {M}_{p,q} Mp,q​代表对象中所有像素和;

4、矩的分类:
①空间矩(普通矩): 具体分为0阶矩:m00、1阶矩:m10, m01、2阶矩: m20,m02,m11、3阶矩:m30,m21,m12,m03;各阶矩物理意义如下:

在这里插入图片描述
在这里插入图片描述

②中心距(central moments):具有位移不变性,利用这些矩,可将出现在图像中任意位置的物体与参考图像中可能出现在另外位置的参考物体进行比较;
在这里插入图片描述
在这里插入图片描述

图像中心计算公式:
在这里插入图片描述

③归一化中心矩:具有缩放不变性,支持图像的缩放进行比较
在这里插入图片描述
在这里插入图片描述

5、图像矩通过Moments()函数计算:
在这里插入图片描述
在这里插入图片描述

图像的Hu矩

1、Hu矩是归一化中心矩的线型组合,具有平移、缩放、旋转、镜面映射不变性,一共有7个double元素组成一个向量;
在这里插入图片描述
2、Hu不变矩通过Humoments()函数计算:
在这里插入图片描述
3、Hu矩对物体形状具有较好的描述
在这里插入图片描述
在这里插入图片描述

形状匹配(matchShape()函数)

1、matchShape()函数比较轮廓相似度,根据Hu矩的原理进行计算:计算结果通过函数返回值返回,返回值越小,相似度越高,返回值为0 , 表示两轮廓完全相似。

在这里插入图片描述
在这里插入图片描述

Code

利用Hu矩进行形状匹配比模板匹配好用一点:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using System.Drawing;

namespace lesson27
{
    class Program
    {
        static void Main(string[] args)
        {
            ///计算轮廓面积、周长、质心
            Mat src = CvInvoke.Imread("mask2.jpg");
            Mat dst = src.Clone();
            Mat grayImg = new Mat();
            CvInvoke.Imshow("input", src);
            CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);
            CvInvoke.Threshold(grayImg, grayImg, 100, 255, ThresholdType.Binary);
            CvInvoke.Imshow("threshold", grayImg);
            //发现轮廓
            VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
            VectorOfRect hierarchy = new VectorOfRect();
            CvInvoke.FindContours(grayImg, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxNone);
            CvInvoke.DrawContours(dst, contours, -1, new MCvScalar(255, 255, 0), 2);
            for (int i = 0; i < contours.Size; i++)
            {
                double area = CvInvoke.ContourArea(contours[i], false);  //计算面积周长
                double length = CvInvoke.ArcLength(contours[i], true);
                MCvMoments moments = CvInvoke.Moments(contours[i], false);       //计算轮廓矩
                Point ptCenter = new Point();
                ptCenter.X = (int)(moments.M10 / moments.M00);          //计算质心
                ptCenter.Y = (int)(moments.M01 / moments.M00);
                CvInvoke.Circle(dst, ptCenter, 3, new MCvScalar(0, 0, 255), -1);//绘制质心
            }
            CvInvoke.Imshow("result", dst);
            CvInvoke.WaitKey(0);

            ///形状匹配(具有旋转、平移、缩放、镜像不变性)
            //Mat temp = CvInvoke.Imread("0.jpg");
            //Mat grayImg1 = new Mat();
            //CvInvoke.Imshow("template", temp);
            //CvInvoke.CvtColor(temp, grayImg1, ColorConversion.Bgr2Gray);
            //CvInvoke.Threshold(grayImg1, grayImg1, 100, 255, ThresholdType.Binary);
            //CvInvoke.Imshow("threshold1", grayImg1);

            //VectorOfVectorOfPoint contours_temp = new VectorOfVectorOfPoint();
            //VectorOfRect hierarchy_temp = new VectorOfRect();
            //CvInvoke.FindContours(grayImg1, contours_temp, hierarchy_temp, RetrType.External, ChainApproxMethod.ChainApproxNone);

            //Mat src = CvInvoke.Imread("1.jpg");
            //Mat grayImg2 = new Mat();
            //CvInvoke.Imshow("input", src);
            //CvInvoke.CvtColor(src, grayImg2, ColorConversion.Bgr2Gray);
            //CvInvoke.Threshold(grayImg2, grayImg2, 100, 255, ThresholdType.Binary);
            //CvInvoke.Imshow("src threshold", grayImg2);

            //VectorOfVectorOfPoint contours_src = new VectorOfVectorOfPoint();
            //VectorOfRect hierarchy_src = new VectorOfRect();
            //CvInvoke.FindContours(grayImg2, contours_src, hierarchy_src, RetrType.Tree, ChainApproxMethod.ChainApproxNone);

            //for(int i = 0; i < contours_src.Size;i++)
            //{
            //    //形状匹配
            //    double matchValue = CvInvoke.MatchShapes(contours_temp[0], contours_src[i], ContoursMatchType.I1);

            //    Console.WriteLine("contour {0} value:{1:F5}", i, matchValue);  //控制输出格式
            //    //根据计算结果绘制轮廓
            //    if(matchValue < 0.1)
            //    {
            //        CvInvoke.DrawContours(src, contours_src, i, new MCvScalar(0, 255, 0), 2);
            //    }
            //    else
            //    {
            //        CvInvoke.DrawContours(src, contours_src, i, new MCvScalar(0, 0, 255), 2);
            //    }
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

        }
    }
}


效果

1、形状匹配:
在这里插入图片描述
2、寻找质心:
在这里插入图片描述

参考

1、https://blog.youkuaiyun.com/cp32212116/article/details/38374015
2、Learning OpenCV3

图像的矩 原理 代码 #include &amp;amp;lt;opencv2/opencv.hpp&amp;amp;gt; #include &amp;amp;lt;iostream&amp;amp;gt; using namespace cv; using namespace std; Mat src_gray; int thresh = 100; RNG rng(12345); void thresh_callback(int, void*) 阅读详情

相关推荐

EmguCV学习(二)

记录EmguCv学习时的点点滴滴吧~ 可视化界面用winform~

工科迷途小书童的博客 6090

图像描述——图像矩

1 矩 矩是概率与统计中的一个概念,是随机变量的一种数字特征。设 X为随机变量,C为常数,则E[(x−c)^k]称为X关于C点的k阶矩。比较重要的两种情况如下: (1) c=0,这时a_k=E(X^k)称为X的k阶原点矩; (2) c=E(X),这时μ_k=E[(X−EX)^k]称为X的k阶中心矩。F(x,y)的(p+q)阶原点矩为 : 一阶原点矩就是期望,一阶中心矩μ_1=0,二阶中心矩μ_2就是X的方差Var(X)。在统计学上,高于4阶的矩极少使用,μ_3可以去衡量分布是否有偏,μ_4可以衡量分布(密

weixin_50860664的博客 3371

EmguCv学习_深入学习读取摄像头

读取摄像头 读取摄像头的方法: VideoCapture cap = new VideoCapture(int camIndex); 1、如果默认笔记本/台式机只有一个USB摄像头,Index=0; 如果有2个,一般Index为0和1,根据具体情况区分,摄像头接入和断开会改变Index值 2、如果接入2个以上,但只想用指定的一个,可以在设备管理器中禁用其他,同时Index设置为0 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtmXd3cn-1592280556

qq_39112175的博客 1492

图像矩(Hu矩)简介

(1)零阶矩  根据矩的定义,二维图像的灰度用f(x,y)表示,零阶矩m00表示为:                                   表示的是图像灰度的总和。   (2)一阶矩  图像的一阶矩m10和m01表示用来确定图像的灰度中心, 根据中心矩的定义很容易计算出,u10=0,u01=0                                      ...

qq_37207090的博客 3万+

EmguCv学习_基本绘图函数

基本绘图函数 主要作用:标记,结果输出 EmguCV常用绘图函数: CvInvoke.Line()//------用于绘制直线 CvInvoke.Circle()//函数------用于绘制圆 CvInvoke.Rectangle()//函数------用于绘制矩形 CvInvoke.Ellipse()//函数------用于绘制椭圆 CvInvoke.PutText()//函数------用于添加文字 绘制直线-----CvInvoke.Line() Line(IIputOutputArra

qq_39112175的博客 2005

EmguCv 学习_摄像头、视频读取_写入

摄像头、视频读取_写入 打开视频 VideoCapture类 opencv2.x以上的版本新增的VideoCapture类,提供了从摄像机或者视频文件中捕获视频的接口 VideoCapture类四种构造函数方法 public VideoCapture(); public VideoCapture(CaptureType capture Type); public VideoCapture(int CamIndex); public VideoCapture(String fileName); 函数

qq_39112175的博客 1907

使用C#+EmguCV处理图像入门(图像读取_显示_保存)二

上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作。 EmguCV图像处理系统组成(个人见解): 图像的基本操作: 贴个代码: using Emgu.CV; //使用命名空间 using Emgu.CV.Structure; using Emgu.CV.CvEnum; using Emgu.Util; ...

weixin_30906185的博客 2511

C#图像处理 | EmguCV+OpenCVSharp二合一教程 你值得拥有

VS2017+EmguCV3.4高清入门视频教程 视频教程原链接如上,内容预览与目录如下 EmguCV+OpenCVSharp视频教程二合一版本 C#视觉开发者必备 EmguCV基础视频教程---第01讲(EmguCV介绍与安装配置) EmguCV基础视频教程---第01讲---补充更新(EmguCV3.4.1安装配置) EmguCV基础视频教程---第02讲(EmguCV自带例程赏析) EmguCV基础视频教程---第03讲(图像读取_显示_保...

Color Space的博客 4417

C#使用EmguCV库(图像读取、显示、保存)(二)

使用C#+EmguCV处理图像入门(图像读取_显示_保存)二 上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作。 EmguCV图像处理系统组成(个人见解): 图像的基本操作: 贴个代码: using Emgu.CV; //使用命名空间 using Emgu.CV.Structure; using Emgu.CV.CvEnum; using Emgu.Util; static void Main(string[] a.

WarGames_dc的博客 4638

opencv 图片相似度比对 C# emgu实现

opencv 图像图片相似度比对 C# emgu实现 1、opencv 的c#版 emgu 2 、图像相似度比对 3、灰度直方图

c#下使用EmguCV操作摄像头和最简单的人脸检测

c#下使用EmguCV操作摄像头和最简单的人脸检测 http://blog.youkuaiyun.com/a582127421/article/details/77745580

EmguCV学习笔记 C# 2.3 Mat类

在EmguCV中还定义有VectorOfRect、VectorOfFloat、VectorOfTriangle2DF等等,特别是还会有VectorOfVectorOf~,表示数组的数组,例如在后面处理图像轮廓时会用到VectorOfVectorOfPoint,表示多个点的数组然后又做了个数组。VectorOfMat中使用Push,也就是增加通道,但需要注意,如果要显示合并后的图像,图像必须有正确的通道数,如,不能有2通道的图像。合并后的多通道Mat对象的通道数等于要合并的单通道Mat对象的数量。

学习微软 .net 技术开发 1794

R语言分布式滞后非线性模型DLNM实战:空气污染与健康数据的动态效应可视化与政策启示

本文详细介绍了R语言中分布式滞后非线性模型(DLNM)的应用,特别关注空气污染与健康数据的动态效应可视化。通过dlnm包实现PM2.5等污染物的滞后效应分析,提供从数据预处理、模型构建到结果可视化的完整流程,并探讨了其在公共卫生政策制定中的实际应用价值。

weixin_29079643的博客 514

关于emgucv的书_EmguCV使用中常用函数总结

1 //EmguCV常用函数总结:2 //读取图片3 Mat SCr = newMat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor);4 //根据路径创建指定的灰度图片5 Mat scr = newMat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.Grayscale);6 获取灰度 //图像类型转...

weixin_39927508的博客 250

EMC辐射发射测试:垂直与水平极化测试原理与实战指南

电磁兼容(EMC)测试是确保电子设备在复杂电磁环境中稳定运行的关键环节,其核心在于评估设备产生的电磁干扰(EMI)强度。辐射发射测试作为EMC测试的重要组成部分,通过测量设备向空间辐射的电磁噪声,判断其是否符合国际标准限值。测试原理基于电磁波的极化特性,即电场矢量的振动方向,主要分为垂直极化和水平极化。理解极化特性对于精准定位辐射源、高效进行EMC整改具有重要技术价值。在工程实践中,垂直极化噪声通常源于线缆辐射等垂直结构,而水平极化噪声多来自PCB走线等水平结构。通过分别测量两种极化方向的辐射最大值,可以全

weixin_32770423的博客 350

Infiniband互连网络概述

一、Infiniband是什么? InfiniBand(简称IB)是一种工业标准规范,它定义了一种输入/输出架构,用于计算节点、通信基础设施设备、存储和嵌入式系统的互连。操作系统可以是Linux、Windows或ESXI。 IB网络一共是五层,从第一天起,IB就被设计为提供一个端到端的解决方案,改善和加速从物理层到上层的所有协议层。 IB协议于2000年由IBTA(InfiniBand Trade Association)提出,其规定了一...

weixin_41687819的博客 5226

c# emgucv 切图_使用C#+EmguCV处理图像入门(图像读取_显示_保存)二

上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作。EmguCV图像处理系统组成(个人见解):图像的基本操作:贴个代码:using Emgu.CV; //使用命名空间usingEmgu.CV.Structure;usingEmgu.CV.CvEnum;usingEmgu.Util;static void Main(string[] a...

weixin_39685836的博客 589

milvus | 第 1 章:从“相似图片搜索”理解 Milvus 向量数据库

本文介绍了向量数据库Milvus的核心概念和基本架构。主要内容包括:1)向量数据库解决的是高维向量相似度检索问题,通过Embedding将非结构化数据转换为向量进行比较;2)Milvus作为分布式向量数据库,包含Proxy、Coordinator、QueryNode等多个组件协同工作;3)关键概念如Collection、Schema、Segment等构成了Milvus的数据组织方式;4)典型使用流程包括创建集合、插入数据、构建索引、加载数据和执行搜索五个步骤。文章为后续深入理解Milvus源码提供了基础知识

weixin_43674738的博客 132

EmguCV学习笔记 VB.Net 2.3 Mat类

在EmguCV中还定义有VectorOfRect、VectorOfFloat、VectorOfTriangle2DF等等,特别是还会有VectorOfVectorOf~,表示数组的数组,例如在后面处理图像轮廓时会用到VectorOfVectorOfPoint,表示多个点的数组然后又做了个数组。VectorOfMat中使用Push,也就是增加通道,但需要注意,如果要显示合并后的图像,图像必须有正确的通道数,如,不能有2通道的图像。合并后的多通道Mat对象的通道数等于要合并的单通道Mat对象的数量。

学习微软 .net 技术开发 1357

ICC2:mem出pin的Off Grid问题

这个命令本意是解决跨制成调用IP时在IP出pin位置加一定的routing blockage,限制绕线在一定范围内只能走直线出pin,用来解决off-grid问题也有很好的效果。在ICC2做先进工艺时会有off-grid的问题,off-grid可以理解为绕线没有在preferred方向track上。测试发现,2022版本以前的ICC2绕线容易有off-grid问题。主要在mem出pin的M2/M3层次上,切换版本绕线能很大程度上解决这个问题。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1629

uniapp | vue2 | vue3 - 解决调用天地图功能服务时 http 网络请求报错 net::ERR ABORTED 503(Service Temporarily Unavailabl)

vue,uni-app,天地图,请求报错,503,请求失败,map.tianditu,天地图503,天地图请求503,接口503错误怎么办,vue天地图,uniAPP天地图,获取定位接口服务器报错503,获取当前定位,定位功能,IP属地定位,天地图服务器报错,如何解决报错,net::ERRABORTED503(ServiceTemporarilyUnavailabl),GET,POST,服务暂时不可用,react天地图,一直等待吗,报错怎么办,定位报错,轨迹,经纬度,天地图服务器503,在vue2

🏆 前端领域优质创作者 4438

关于emgucv的书_EmguCV学习(二)

(1)图像锐化处理//此部分代码功能是锐化图像,本质上是扫描图像并访问相邻像素//sharpened_pixel=5*current-left-right-up-downbytesaturateCast(doubleinValue){if(inValuereturn0;elseif(inValue>255)return255;elsereturn(byte)inVal...

weixin_39627751的博客 342

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 929

29-分水岭算法与图像修补(EmguCV学习)

文章目录说明 说明

hello 1046

【FISCO BCOS】二十、多机部署区块链

实际开发中,为了满足高可用性和高容错性的需求,往往会采用多级部署区块链的方式,今天介绍一下FISCO BCOS的多机部署流程。

naihe_fish的博客 3647

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

EmguCV学习——简单使用

关于EmguCV我就不多说了,是对应于OpenCV的一套net库。 公司是视觉方面的业务,我又不会c++(好想会啊,正在学习中)。由于各种需求,自己觉得对c++不是特别感冒,所以选用了net下的opencv的封装EmguCV。python也有对应的opencv的库。无奈我python还处于入门阶段。 不废话,先说Emgucv的配置,我是看园子里的博客配置的,附上链接: http://www...

weixin_30919235的博客 210

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 26-最小外接圆、椭圆、轮廓长度、轮廓面积(EmguCv学习)
下一篇: 29-分水岭算法与图像修补(EmguCV学习)
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值