矩的概念介绍

可以参考:https://blog.csdn.net/keith_bb/article/details/70197104

  • 几何矩( 其中P(i,j)为图像在坐标点(i,j)处的灰度值。)
  • 中心距
  • 中心归一化距

    其中:图像中心Center(x0, y0)。 此非图像坐标的中心点,而是图像 质 的中心,质点

API介绍与使用 – cv::moments 计算生成数据

API介绍与使用-计算矩cv::moments

opencv中提供了moments()来计算图像中的中心矩(最高到三阶),HuMoments()用于由中心矩计算Hu矩.同时配合函数contourArea函数计算轮廓面积和arcLength来计算轮廓或曲线长度

  • moments( // 计算矩,返回 0阶到3阶所有的几何矩,2阶到3阶所有的中心矩,2阶到3阶所有的中心归一矩
    InputArray array,//输入数据,findContours 找到的轮廓数据
    bool binaryImage=false // 是否为二值图像
    )

    1. array:输入数组,可以是光栅图像(单通道,8-bit或浮点型二维数组),或者是一个二维数组(1 X N或N X 1),二维数组类型为Point或Point2f
    2. binaryImage:默认值是false,如果为true,则所有非零的像素都会按值1对待,也就是说相当于对图像进行了二值化处理,阈值为1,此参数仅对图像有效。
  • contourArea(
    InputArray contour,//输入轮廓数据
    bool oriented// 默认false、返回绝对值)

    1. contour:是一个向量,二维点,可以是vector或Mat类型
    2. oriented:有默认值false,面向区域标识符,如果为true,该函数返回一个带符号的面积,其正负取决于轮廓的方向(顺时针还是逆时针)。根据这个特性可以根据面积的符号来确定轮廓的位置。如果是默认值false,则面积以绝对值的形式返回.
    3. 该函数使用Green formula计算轮廓面积,返回面积和非零像素数量如果使用drawContours或fillPoly绘制轮廓,可能导致不同。
  • arcLength( //用于计算封闭轮廓的周长或曲线的长度
    InputArray curve,//输入曲线数据
    bool closed// 是否是封闭曲线)

    1. curve:输入二维点集,可以是vector或Mat类型
    2. closed:曲线是否封闭的标志位,true则封闭否则不封闭

演示代码-步骤

  1. 提取图像边缘
  2. 发现轮廓
  3. 计算每个轮廓对象的矩
  4. 计算每个对象的中心、弧长、面积

程序代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;//定义全局变量
Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);//声明回调函数
void thresh_callback(int, void* );int main( int argc, char** argv )
{// 读入原图像, 返回3通道图像数据src = imread("E:/Experiment/OpenCV/Pictures/CircleTest2.jpg");// 创建新窗口char* source_window = "Source";namedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );// 把原图像转化成灰度图像并进行平滑cvtColor( src, src_gray, CV_BGR2GRAY );//blur( src_gray, src_gray, Size(3,3) );GaussianBlur(src_gray, src_gray, Size(3, 3), 0, 0);//这里用高斯模糊去噪,相比于均值,轮廓发现的准确imshow("灰度图", src_gray);createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback );thresh_callback( thresh, 0 );waitKey(0);return(0);
}void thresh_callback(int, void* )
{Mat canny_output;vector<vector<Point> > contours;vector<Vec4i> hierarchy;// 使用Canndy检测边缘Canny( src_gray, canny_output, thresh, thresh*2, 3 );//提取边缘// 找到轮廓findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//发现轮廓// 计算图像矩vector<Moments> mu(contours.size() );//存放各阶各种矩for( int i = 0; i < contours.size(); i++ ){//计算矩,返回 0阶到3阶所有的几何矩,2阶到3阶所有的中心矩,2阶到3阶所有的中心归一矩mu[i] = moments( contours[i], false ); }//  计算中心矩,即图像的质心:vector<Point2f> mc( contours.size() );//各阶各种矩的图像中心,质点for( int i = 0; i < contours.size(); i++ ){mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }// 绘制轮廓Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );for( int i = 0; i< contours.size(); i++ ){Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );//绘制轮廓circle( drawing, mc[i], 4, color, -1, 8, 0 );//绘制质点}// 显示到窗口中namedWindow( "Contours", CV_WINDOW_AUTOSIZE );imshow( "Contours", drawing );// 通过m00计算轮廓面积并且和OpenCV函数比较printf("\t Info: Area and Contour Length \n");for( int i = 0; i< contours.size(); i++ ){printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) );Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );circle( drawing, mc[i], 4, color, -1, 8, 0 );}
}

运行截图


参考博客

  1. https://blog.csdn.net/keith_bb/article/details/70197104
  2. https://blog.csdn.net/huanghuangjin/article/details/81189586
  3. https://blog.csdn.net/LYKymy/article/details/83210439

OpenCV-图像处理(31、图像矩(Image Moments))相关推荐

  1. OpenCv图像处理之图像视频摄像头读取和保存

    OpenCv图像处理之图像视频摄像头读取与保存 使用cv::imread()读取图片 使用cv::imwrite()存储图片 使用cv::VideoCapture::open()读取视频 使用cv:: ...

  2. OpenCV图像处理(十一)---图像梯度

    安培定则:也叫右手螺旋定则,是表示电流和电流激发磁场的磁感线方向间关系的定则.通电直导线中的安培定则(安培定则一):用右手握住通电直导线,让大拇指指向电流的方向,那么四指指向就是磁感线的环绕方向:通电 ...

  3. OpenCv图像处理之图像归一化

    OpenCv图像处理之图像归一化 归一化 中心化 标准化 归一化 图像处理中,图像单通道像素值为0~255之间的uchar类型,通常使用min-max归一化将其转化为0~1区间之间,既不会改变数据的分 ...

  4. 《OpenCv视觉之眼》Python图像处理二十一:Opencv图像处理之图像线性变换和非线性变换的方法及原理

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  5. opencv之图像矩 image moments

    矩的概念介绍 几何矩 几何矩 中心矩 中心归一化矩 图像中心 x0=m10÷m00x_0=m10\div m00x0​=m10÷m00 y0=m01÷m00y_0=m01\div m00y0​=m01 ...

  6. Python OpenCV 图像处理之 图像运算和图像位运算知识补充

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 51 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  7. OpenCV图像处理--将图像裁剪为圆形

    1,需求 为了便于项目前端展示用户头像,需要将头像处理为圆形,非圆形区域设置为透明.其实,前端可以在显示的时候处理,但是前端采用WebGL,暂时搞不定,所以由后端进行图像的一次性加工. 于是,我们尝试 ...

  8. Opencv图像处理(图像的线性灰度变换)

    图像增强简介 分段线性法变换原理 代码实现和效果预览 疫情期间,楼主作为大三学生每天除了要应付网课和作业之外还得抽出时间准备研究生考试.虽说少了很多时间学习自己喜欢的知识,但近期由于课程作业关系需要在 ...

  9. OpenCV图像处理——判断图像是否失焦模糊

    前言 在图像处理中,避免不了会碰到一些失焦模糊的图像,特别在读取和初始化摄像头的时候,对失焦模糊判断是避免不了的一步,那么如何使用opencv去判断一张图像是否模糊呢? 判断是否失焦 失焦的图片和对焦 ...

  10. Opencv 图像处理:图像通道、直方图与色彩空间

    本文已收录于Opencv系列专栏: 深入浅出OpenCV ,专栏旨在详解Python版本的Opencv,为计算机视觉的开发与研究打下坚实基础.免费订阅,持续更新. 文章目录 1.图像通道 通道分离 通 ...

最新文章

  1. Oracle 11g dataguard主库坏块修复
  2. c语言字符串化简,华为面试题:一元多项式的化简 C语言实现源码
  3. Redis搭建(二):主从复制
  4. 橱柜高度与身高对照表_橱柜高度与身高公式是什么
  5. d3.js 共享交换平台demo
  6. oracle数据库存储ip地址,oracle – 以十进制形式存储的IP地址 – PL / SQL以虚线四边形显示...
  7. 没想到,我们的分布式缓存竟这样把注册中心搞垮!
  8. linux驱动编写(nand flash驱动)
  9. 数据库基础:什么是SQL
  10. 阶段3 3.SpringMVC·_06.异常处理及拦截器_4 SpringMVC拦截器之介绍和搭建环境
  11. 破解vysor为专业版
  12. 一网打尽 SCI、SCIE、SSCI 、EI等指标及影响因子查询
  13. 从《色戒》,看人性的欲望
  14. 产业互联网周报:中国移动:择时分拆业务上市;金山云CEO王育林辞职;谷歌负面缠身,数据中心爆炸又遭罚款...
  15. xlsxwriter php,xlsxwriter(PHP工作表插件)
  16. 由内而外全面造就自己(七)
  17. 组合优化- 均值方差、最大夏普、风险平价模型
  18. C++对接国际验证码接口DEMO示例
  19. 常用的PostMethod及getMethod请求
  20. 高云FPGA系列教程(基于GW1NSR-4C TangNano 4K开发板)

热门文章

  1. sqlserver两种分页方法比较
  2. linux和window是服务器时间同步
  3. [ACM] hdu 2079 选课时间(普通型母函数)
  4. c/c++中与字符串处理相关的函数
  5. linux下使用hash_map及STL总结
  6. 快讯:百度正式宣布CTO李一男离职
  7. 蓝桥杯 算法提高 全排列 next_pertumutation
  8. Git部署Git使用Git子模块
  9. mysql源码启动_mysql源码分析-启动过程
  10. JavaSE基础篇之-Java 流(Stream)、文件(File)和IO