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

OpenCV第五讲: 形态学滤波

形态学的基本运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰度腐蚀和膨胀等

1. 腐蚀、膨胀

形态学操作就是基于形状的一系列图像处理操作,本文中的膨胀是对图像的高亮部分进行膨胀,腐蚀是对原图中的高亮部分被腐蚀。从数学角度来讲,这两种操作就是将图像与进行卷积。

  • 膨胀

    就是求局部最大值操作,将图像与卷积,即计算核覆盖区域的像素点的最大值,然后将这个最大值赋给参考点指定的像素。

  • 腐蚀

    与膨胀刚好相反,它是求局部最小值, 但计算和原理类似。

  • 通俗理解和解释

    从实现效果看,膨胀相当于将原图像的局部亮度调亮,使得图像的对比度缺失;腐蚀相当于将图像局部亮度降低,增加了区域之间的对比度,但掩盖了部分细节。

  • OpenCV函数

      dilate	#膨胀 
      erode		#腐蚀
    

2. 开运算、闭运算、形态学梯度、顶帽、黑帽

利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换。

  • 开运算

    先腐蚀后膨胀, 可以用来消除小物体。

	open(src, element) = dilate( erode(src, element) )
  • 闭运算

    先膨胀后腐蚀, 能够排除小型黑洞。

	close(src, elemet) = erode( dilate(src, element) )
  • 形态学梯度

    是膨胀图与腐蚀图之差,可以用来保留物体的边缘轮廓。

	dst = morph - grad(src, element) = dilate(src, element) - erode(src, element)
  • 顶帽

    是原图像与开运算结果图之差,用来分离比临近点亮一些 的斑块,在一定情况下,可以使用顶帽运算进行背景提取。-- 提取背景

	dst = tophat(src, element) = src - open(src, element)
  • 闭帽

    是原图像与闭运算结果图之差,用来分离比临近点暗一些的斑块,可以较好的提取物体的轮廓信息。-- 提取轮廓

	dst = blackhat(src, element) = close(src, element) - src

3. 源代码剖析

利用morphologyEx()函数可以实现多种高级形态学变换(上述所讲都可实现)。

	/*********************************************************************
	 * 形态学操作:
	 * void morphologyEx( InputArray src, OutputArray dst,
	 *                               int op, InputArray kernel,
	 *                               Point anchor = Point(-1,-1), int iterations = 1,
	 *                               int borderType = BORDER_CONSTANT,
	 *                               const Scalar& borderValue = morphologyDefaultBorderValue() );
	 * op: 选择各种不同的形态学操作
	 * 
	 * enum MorphTypes{
		    MORPH_ERODE    = 0, 	//!< see cv::erode
		    
		    MORPH_DILATE   = 1, 	//!< see cv::dilate
		    
		    MORPH_OPEN     = 2,	 	//!< an opening operation
				    
		    MORPH_CLOSE    = 3, 	//!< a closing operation
				      
		    MORPH_GRADIENT = 4, 	//!< a morphological gradient
				     
		    MORPH_TOPHAT   = 5, 	//!< "top hat"
				    
		    MORPH_BLACKHAT = 6, 	//!< "black hat"
				       
		    MORPH_HITMISS  = 7  	//!< "hit or miss"
			//!<   .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation
		};

		cv::MorphTypes	-- 不同的形态学操作
		cv::MorphShapes  -- 核的不同形状
	 
	 -- 获取不同大小的内核函数
 
		Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
		
	 *******************************************************************/
		cv::Mat morImg;
		Mat He_element = getStructuringElement(0, Size(15,15));  //   cv::MorphShapes
		morphologyEx(srcImage, morImg, 4, He_element);
		imshow("形态学操作", morImg);

相关文章:

  • OpenCV第六讲: 漫水填充、图像金字塔
  • OpenCV第七讲:阈值的作用
  • OpenCV第八讲:图像变换之边缘检测(Canny+Sobel算子)
  • V-SLAM 回环检测与后端优化重读
  • OpenCV第九讲:图像变换之边缘检测(Laplacian +Scharr 算子)
  • OpenCV第十讲:图像几何形状识别之霍夫变换
  • OpenCV 第十一讲: 重映射、仿射变换、直方图均衡化
  • OpenCV第十二讲:角点检测与亚像素精度
  • OpenCV第十三讲:SURF特征点的检测与匹配详解
  • OpenCV第十四讲: Fast特征点与ORB特征点原理详解
  • DAVIS第一课: 事件相机的工作原理和相关核心功能简介
  • DAVIS第二课:基于事件相机的视觉里程计
  • Rtab-Map学习之rtabmap_ros源代码剖析
  • DAVIS前言:事件相机资料调研
  • DAVIS第三课: 基于事件相机的光流法计算
  • 08.Android之View事件问题
  • Apache Zeppelin在Apache Trafodion上的可视化
  • bootstrap创建登录注册页面
  • gf框架之分页模块(五) - 自定义分页
  • hadoop集群管理系统搭建规划说明
  • Hibernate最全面试题
  • interface和setter,getter
  • Java小白进阶笔记(3)-初级面向对象
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • 编写高质量JavaScript代码之并发
  • 关于Flux,Vuex,Redux的思考
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 理解在java “”i=i++;”所发生的事情
  • 力扣(LeetCode)357
  • 前端js -- this指向总结。
  • 如何用vue打造一个移动端音乐播放器
  • 我看到的前端
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • AI算硅基生命吗,为什么?
  • 阿里云服务器购买完整流程
  • # Maven错误Error executing Maven
  • #define,static,const,三种常量的区别
  • #includecmath
  • #pragma once与条件编译
  • (14)Hive调优——合并小文件
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (排序详解之 堆排序)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (译)2019年前端性能优化清单 — 下篇
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)德国人的记事本
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net mvc 获取url中controller和action
  • .Net 高效开发之不可错过的实用工具
  • .NET 设计模式初探