矩(moments)是描述图像特征的算子,被广泛应用于图像检索和识别,以及图像匹配、图像重建、图像压缩及运动图像分析等领域。

接下来介绍图像矩的原理。

在物理上,有个概念叫“力矩”,相信大家都有印象。力F对点O的矩,不仅决定于力的大小,同时与矩心的位置有关,矩心的位置不同,力矩随之不同。

借助于物理学上的这个概念,我们可以定义图像的矩。图像的矩有很多种,接下来介绍几个常用的图像矩并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置。

目录

  • 一、图像空间矩【spatial moments】
  • 二、图像的中心矩【central moments】
  • 三、图像归一化的中心矩【normalized central moments】
  • 四、利用OpenCV的类Moments计算图像或点集(轮廓)的空间矩、中心矩和归一化的中心矩

一、图像空间矩【spatial moments】

我们先来看图像空间矩【spatial moments】的概念
这里插一句题外话,有些资料把空间矩也称为叫几何矩,博主觉得叫几何矩不准确,因为几何矩是几何图形的矩,而几何图形是不考虑每一点的像素值大小的。

图像空间矩【spatial moments】的计算公式如下:

其中,array(x,y)array(x,y)array(x,y)是像素(x,y)处的像素值。
注意:x代表的是像素的列号,而不是行号;y代表的是像素的行号,而不是列号。这一点可以在下面的示例代码的运行结果中看出。这也是为什么上面m的下标不是“ijijij”而是“jijiji”的原因。

从这个计算式我们可以看出,图像的空间矩不仅与像素值大小有关,还与像素的位置有关,这一点和物理学中力矩的概念是一致的。

当j=i=0j=i=0j=i=0时,有m00=∑x,yarray(x,y)x0y0=∑x,yarray(x,y)m_{00}=\sum_{x,y}array(x,y)x^{0}y^{0}=\sum_{x,y}array(x,y)m00​=∑x,y​array(x,y)x0y0=∑x,y​array(x,y)

此时m00m_{00}m00​称为叫图像的零阶空间矩,从这个计算式我们可以看出,图像的零阶空间矩实际上就是所有像素值的累加,零阶矩的值与像素的位置无关。

当j=0,i=1j=0,i=1j=0,i=1或j=1,i=0j=1,i=0j=1,i=0时,m01m_{01}m01​、m10m_{10}m10​称为图像的一阶空间矩,很明显,图像的一阶空间矩在空间位置上只与像素的行号或列号有关。以此类推,可以有图像的二阶空间矩,三阶空间矩等。比如以下三种情况都是图像的二阶空间矩:
① j=0,i=2,即m02m_{02}m02​
② j=1,i=1,即m11m_{11}m11​
③ j=2,i=0,即m20m_{20}m20​

根据图像的零阶空间矩和一阶空间矩,我们可以定义出图像的质心的坐标计算式:

xˉ=m10m00\bar{x}=\frac{m_{10}}{m_{00} }xˉ=m00​m10​​,yˉ=m01m00\bar{y}=\frac{m_{01}}{m_{00}}yˉ​=m00​m01​​ 注意,xˉ\bar{x}xˉ是列号,yˉ\bar{y}yˉ​是行号。

二、图像的中心矩【central moments】

图像的中心矩的计算式如下:

式中的xˉ\bar{x}xˉ和yˉ\bar{y}yˉ​就是图像的质心位置坐标(上边已经介绍过了),即:

xˉ=m10m00\bar{x}=\frac{m_{10}}{m_{00} }xˉ=m00​m10​​,yˉ=m01m00\bar{y}=\frac{m_{01}}{m_{00}}yˉ​=m00​m01​​ 注意,xˉ\bar{x}xˉ是列号,yˉ\bar{y}yˉ​是行号。

根据上面的计算式,容易得到:
  

三、图像归一化的中心矩【normalized central moments】

图像归一化的中心矩的计算式如下:

根据上面的计算式容易得到:
nu00=1nu_{00}=1nu00​=1  nu10=nu01=0nu_{10}=nu_{01}=0nu10​=nu01​=0

四、利用OpenCV的类Moments计算图像或点集(轮廓)的空间矩、中心矩和归一化的中心矩

OpenCV提供了类Moments来计算图像或点集(轮廓)的空间矩、中心矩和归一化的中心矩。
下面介绍这个类Moments。
先说类Moments的成员函数moments(),这个成员函数的原型如下:

Moments cv::moments  (   InputArray  array,bool  binaryImage = false )

成员函数moments()用于计算多边形或像素图像的三阶(包含三阶)以下的空间矩、中心矩和归一化的中心矩。官方文档原话如下:
Calculates all of the moments up to the third order of a polygon or rasterized shape.
其参数意义如下:
array—Raster image (single-channel, 8-bit or floating-point 2D array) or an array ( 1×N or N×1 ) of 2D points (Point or Point2f )。
binaryImage—If it is true, all non-zero image pixels are treated as 1’s. The parameter is used for images only.
以上英文很简单,就不翻译了,不明白的再加博主的微信/QQ 2487872782交流吧。
再说类Moments的成员变量,它的成员变量和表示的意义分别如下:


注意:由于

所以上面的中心矩没有mu00mu_{00}mu00​、mu01mu_{01}mu01​、mu10mu_{10}mu10​这几个。

注意:由于nu00=1nu_{00}=1nu00​=1  nu10=nu01=0nu_{10}=nu_{01}=0nu10​=nu01​=0

所以上面的归一化中心矩没有nu00nu_{00}nu00​、nu10nu_{10}nu10​、nu01nu_{01}nu01​这几个。

接下来是使用类Moments计算图像轮廓的空间矩、质心位置、中心矩、归一化中心矩的示例代码。
代码中用到的图像下载链接:https://pan.baidu.com/s/1ZfOReFRyeMDLhk3PjJXGwA?pwd=aes8

//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601//OpenCV版本:3.0
//VS版本:2013#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>#include <iostream>using namespace cv;
using namespace std;int main()
{Mat srcGary = imread("F:/material/images/P0045-ellipse-02.jpg", 0);imshow("srcGary", srcGary);// 阈值化操作Mat threMat;int thresh = 128;threshold(srcGary, threMat, thresh, 255, THRESH_BINARY);vector<vector<Point>> contours;// find ContoursfindContours(threMat, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);cout << "检测到的轮廓个数为:" << (int)contours.size() << endl << endl;// draw ContoursMat contours_img(srcGary.size(), CV_8U, Scalar(0));drawContours(contours_img, contours, -1, Scalar(255), 1);imshow("contours_img", contours_img);//计算质心位置Moments moments_1 = moments(contours[0]);double moments_1_m00 = moments_1.m00;cout << "空间矩m00的值为:" << moments_1_m00 << endl << endl;double moments_1_m10 = moments_1.m10;cout << "空间矩m10的值为:" << moments_1_m10 << endl << endl;double moments_1_m01 = moments_1.m01;cout << "空间矩m01的值为:" << moments_1_m01 << endl << endl;int cx = moments_1_m10 / moments_1_m00;cout << "质心的列号为(横坐标-x坐标):" << cx << endl << endl;int cy = moments_1_m01 / moments_1_m00;cout << "质心的行号为(列坐标-y坐标)::" << cy << endl << endl;//用绿色的实心圆把质心绘制出来Point center_point = Point(cx, cy);Mat result_img = srcGary.clone();cvtColor(result_img, result_img, CV_GRAY2BGR);circle(result_img, center_point, 5, Scalar(0, 220, 0), CV_FILLED, CV_AA, 0);imshow("result_img", result_img);double moments_1_mu11 = moments_1.mu11;cout << "中心矩mu11的值为:" << moments_1_mu11 << endl << endl;double moments_1_nu11 = moments_1.nu11;cout << "归一化的中心矩nu11的值为:" << moments_1_nu11 << endl << endl;waitKey();return(0);
}

运行结果如下图所示:




下一篇博文,介绍下Hu矩,Hu矩是由二阶和三阶中心距计算得到七个不变矩,Hu矩具有旋转、平移和缩放不变性,因此在图像具有旋转和放缩的情况下Hu矩具有更广泛的应用领域。
关于Hu矩,等写好后再把链接放到这里吧。
博主2022-05-12 18:29:35注:已经写好了介绍Hu矩的博文,链接如下:
图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配

什么叫图像或轮廓的空间矩、中心矩、归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置相关推荐

  1. 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配

    本文承接博主的上一篇博文: 什么叫图像或轮廓的空间矩.中心矩.归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置 继续介绍Hu矩的相关知识. Hu矩是由二阶和三阶中心距计算 ...

  2. (三)OpenCV中的图像处理之轮廓

    注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正 该章节分为以下四个小节: (一)     Contour ...

  3. 基于3DSOM的侧影轮廓方法空间三维模型重建

    基于3DSOM的侧影轮廓方法空间三维模型重建 1 背景知识 1.1 三维信息获取方法 1.2 侧影轮廓方法原理及其流程 2 三维模型制作 2.1 马铃薯三维模型制作 2.1.1 多角度图像导入 2.1 ...

  4. 【camera】自动驾驶感知系统实现(车道线检测和拟合、目标检测与跟踪、道路可行驶区域分割、深度估计、图像视野到BEV空间映射、像平面到地平面映射)

    自动驾驶感知系统实现(车道线检测和拟合.目标检测与跟踪.道路可行驶区域分割.深度估计.图像视野到BEV空间映射.像平面到地平面映射) 项目下载地址:项目下载地址 推理引擎下载地址:推理引擎下载地址 支 ...

  5. 利用OpenCV进行图像的轮廓检测

    简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...

  6. 第2章 Python 数字图像处理(DIP) --数字图像基础2 - 图像感知要素 - 图像取样和量化 - 空间分辨率和灰度分辨率

    目录 图像感知与获取 一个简单的成像模型 图像取样和量化 空间分辨率和灰度分辨率 图像感知与获取 一个简单的成像模型 我们用形如 f(x,y)f(x,y)f(x,y) 的二维函数来表示图像.在空间坐标 ...

  7. 如何在程序中判断当前的qq空间图像是默认的空间图像------我现在已经不太喜欢严密的东东了

    最近碰到一个问题, 需要在php程序中判断当前的qq空间图像是默认的空间图像, 别跟我说md5. 当时第一直觉觉得不可能,  但这个问题又不得不解决啊. 跟朋友们讨论后, 大家也帮提供了各种各样的点子 ...

  8. 使用Python、OpenCV计算轮廓的中心

    1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中 ...

  9. 如何利用OpenCV寻找轮廓的中心?

    简 介: 本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点.当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准. 关键词: OpenCV,contours ...

  10. OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

最新文章

  1. Node.js中的express框架,修改内容后自动更新(免重启),express热更新
  2. 【cocos2d-x 手游研发----研发思路及感想】
  3. linux cgoup内存限制,Linux Cgroup系列(05):限制cgroup的CPU使用(subsystem之cpu)
  4. 中断处理的tasklet(小任务)机制-不过如此
  5. PostgreSQL进程结构
  6. 全球最厉害的14位程序员
  7. Java Web ConnectionPool (连接池技术)
  8. Android 布局渲染流程与卡顿优化
  9. Android学习Tabhost、gallery、listview、imageswitcher
  10. c语言创建若干个成绩栏目,2015年计算机二级《C语言》考试上机测试题(6)
  11. 功率是电压电流乘积的波形在一个周期内积分后除以周期。
  12. 30分钟让你成为photoshop钢笔工具…
  13. 建议更新IE浏览器的版本
  14. WinForm PrintDocument 进行打印标签
  15. 用PXE方法从裸机批量推Oracle 11gR2 RAC环境
  16. Python入门教程:什么是网络爬虫
  17. Linux命令之curl命令
  18. 纳米金/银修饰空心/杂化/纳米管和链霉亲和素修饰/纳米金粒子修饰单分散聚苯乙烯微球制备方式
  19. 跨交换机打通二层广播域不通问题解决过程
  20. 信息论的一些基础概念

热门文章

  1. 潇洒郎:Python开发 邮件群发助手:定时发送
  2. vscode远端编程 终极方案
  3. canvas入门级基本用法实现雨滴下落特效
  4. Linux-发送邮件
  5. C++ 实现贪吃蛇游戏(免费附源码)
  6. Python模拟用户自动登陆网易126邮箱
  7. 计算机的数字符号化是什么,电脑输入数字变成符号怎么办
  8. 星星之火-26:3G CDMA系统中单用户的扩频原理
  9. JAVA实验三(南邮)
  10. 记GMGDC2013大会