当前位置: 首页 > news >正文

形态学边界提取

Opencv中函数getStructuringElement()可以生成形态学操作中用到的核,函数原型:

Mat getStructuringElement(int shape, //核的形状  0:矩形  1:十字交叉形  2: 椭圆 
						  Size ksize,//核大小
						  Point anchor=Point(-1,-1) //核中心位置,默认位于形状中心处
						  );


矩形、十字交叉形和椭圆形的区别可以通过输出矩阵对比一下:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;

int main(int argc,char *argv[])
{
	Mat elementRect,elementCross,elementEllipse;
	elementRect=getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
	elementCross=getStructuringElement(MORPH_CROSS,Size(3,3),Point(-1,-1));
	elementEllipse=getStructuringElement(MORPH_ELLIPSE,Size(3,5),Point(-1,-1));

	std::cout<<"3*3矩形核:"<<std::endl<<elementRect<<std::endl;
	std::cout<<"3*3十字叉形核:"<<std::endl<<elementCross<<std::endl;
	std::cout<<"3*3椭圆形核:"<<std::endl<<elementEllipse<<std::endl;
	system("pause");
}

输出:



膨胀从字面上理解就知道是对图像胀大的操作,使图像中的物体的轮廓向外发散,体积变大;

腐蚀从字面上理解就知道是对图像缩小的操作,腐蚀了就意味着图像中物体的边界被侵蚀了,轮廓向内收缩,体积变小了。

要注意的是这里的膨胀和腐蚀的概念是针对图像中高亮区域而言的(二值图像中对应像素值255,白色),变大和缩小也是针对图像中高亮的部分。

所以对图像执行膨胀,对高亮区域是胀大,面积增大,对暗区域相当于是腐蚀,面积缩小。


下边的小程序利用形态学的膨胀和腐蚀操作提取边界。

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"

using namespace cv;


int main(int argc,char *argv[])
{
	Mat image,imageGray,imageDilate,imageErode,imageBorder;
	image=imread(argv[1]);
	resize(image,image,Size(400,400));
	cvtColor(image,imageGray,CV_RGB2GRAY);

	//enum { MORPH_RECT=0, MORPH_CROSS=1, MORPH_ELLIPSE=2 };
	Mat element=getStructuringElement(1,Size(3,3),Point(-1,-1));
	dilate(imageGray,imageDilate,element,Point(-1,-1));
	erode(imageGray,imageErode,element,Point(-1,-1));
	imageBorder=imageDilate-imageErode;
	imshow("Source image",image);
	imshow("Dilate",imageDilate);
	imshow("Erode",imageErode);
	imshow("Border",imageBorder);	
	waitKey();
}




转载于:https://www.cnblogs.com/mtcnn/p/9411997.html

相关文章:

  • out传值
  • 从0-1体验大数据开发
  • Android控件-单选按钮RadioButton
  • 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化
  • Linux上分析java程序的问题
  • OC点语法和变量作用域
  • Docker个人学习总结
  • Java NIO 系列教程 转
  • git常用命令以及速查命令
  • 数字电路基础(网络整理)
  • Vue.js学习笔记(4)
  • mysql数据库权限及编码
  • web前端之HTML的前世今生
  • Could not find or load main class org.gradle.wrapper.GradleWrapperMain解决办法
  • HTML5 图片边框
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 30天自制操作系统-2
  • 77. Combinations
  • CSS实用技巧
  • HTTP 简介
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Laravel 菜鸟晋级之路
  • maya建模与骨骼动画快速实现人工鱼
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Rancher-k8s加速安装文档
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Sublime text 3 3103 注册码
  • Vue--数据传输
  • 第2章 网络文档
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 消息队列系列二(IOT中消息队列的应用)
  • 用 Swift 编写面向协议的视图
  • 主流的CSS水平和垂直居中技术大全
  • 昨天1024程序员节,我故意写了个死循环~
  • ​马来语翻译中文去哪比较好?
  • #Java第九次作业--输入输出流和文件操作
  • $.ajax中的eval及dataType
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (30)数组元素和与数字和的绝对差
  • (4)(4.6) Triducer
  • (二开)Flink 修改源码拓展 SQL 语法
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (接口封装)
  • (排序详解之 堆排序)
  • (七)Java对象在Hibernate持久化层的状态
  • (转)大型网站架构演变和知识体系
  • .cfg\.dat\.mak(持续补充)
  • .net core 控制台应用程序读取配置文件app.config
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET中的十进制浮点类型,徐汇区网站设计