一、形态学概述

我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。

下面是来自百度百科对数学形态学的解释:

数学形态学是由一组形态学的代数运算子组成的,它的基本运算有4个: 膨胀(或扩张)、腐蚀(或侵蚀)、开启和闭合,它们在二值图像和灰度图像中各有特点。基于这些基本运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割、特征抽取、边缘检测、图像滤波、图像增强和恢复等。数学形态学方法利用一个称作结构元素的“探针”收集图像的信息,当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。数学形态学基于探测的思想,与人的FOA(Focus Of Attention)的视觉特点有类似之处。作为探针的结构元素,可直接携带知识(形态、大小、甚至加入灰度和色度信息)来探测、研究图像的结构特点。

本篇文章主要描述的是形态学操作中的膨胀、腐蚀。

膨胀与腐蚀能实现多种多样的功能,主要如下:

消除噪声

分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。

寻找图像中的明显的极大值区域或极小值区域

求出图像的梯度

二、膨胀

其实,膨胀就是求局部最大值的操作。

按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。

核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点(anchorpoint)。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。

而膨胀就是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。如下图所示,这就是膨胀操作的初衷。

下面上一张膨胀运算的效果图:

三、腐蚀

再来看一下腐蚀,大家应该知道,膨胀和腐蚀是一对好基友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。

我们一般都会把腐蚀和膨胀对应起来理解和学习。下文就可以看到,两者的函数原型也是基本上一样的。

原理图:

下面上一张腐蚀的效果图:

四、API函数

接下来我们来看看OpenCV是用哪些函数实现这些运算的:

1.膨胀--dilate

使用像素邻域内的局部极大运算符来膨胀一张图片,从src输入,由dst输出。支持就地(in-place)操作。

函数原型:

void dilate(

InputArray src,

OutputArray dst,

InputArray kernel,

Point anchor=Point(-1,-1),

int iterations=1,

int borderType=BORDER_CONSTANT,

const Scalar& borderValue=morphologyDefaultBorderValue()

);

参数详解:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。

第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。

第三个参数,InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。

第四个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。

第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1。

第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

第七个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。

我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素。

其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:

矩形: MORPH_RECT

交叉形: MORPH_CROSS

椭圆形: MORPH_ELLIPSE

而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。

使用dilate函数,一般我们只需要填前面的三个参数,后面的四个参数都有默认值。

调用范例:

Mat img = imread("dog.jpg");

Mat out;

dilate(img, out, getStructuringElement(MORPH_RECT, Size(50, 50)));

2.膨胀--erode

使用像素邻域内的局部极小运算符来腐蚀一张图片,从src输入,由dst输出。支持就地(in-place)操作。

函数原型:

void erode(

InputArray src,

OutputArray dst,

InputArray kernel,

Point anchor=Point(-1,-1),

int iterations=1,

int borderType=BORDER_CONSTANT,

const Scalar& borderValue=morphologyDefaultBorderValue()

);

参数详解:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。

第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。

第三个参数,InputArray类型的kernel,腐蚀操作的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。

第四个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它。

第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1。

第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

第七个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

同样的,使用erode函数,一般我们只需要填前面的三个参数,后面的四个参数都有默认值。而且往往结合getStructuringElement一起使用。

调用范例:

Mat img = imread("dog.jpg");

Mat out;

erode(img, out, getStructuringElement(MORPH_RECT, Size(50, 50)));

五、开运算、闭运算

开运算,其实就是先腐蚀后膨胀的过程。反之闭运算就是先膨胀后腐蚀的过程。

开运算、闭运算的函数--morphologyEx

morphologyEx函数利用基本的膨胀和腐蚀技术(也能实现膨胀和腐蚀),来执行更加高级形态学变换,如开闭运算等操作。这一节我们来了解它的参数意义和使用方法。

void morphologyEx(

InputArray src,

OutputArray dst,

int op,

InputArraykernel,

Pointanchor=Point(-1,-1),

intiterations=1,

intborderType=BORDER_CONSTANT,

constScalar& borderValue=morphologyDefaultBorderValue() );

参数详解:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。

第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:

MORPH_DILATE – 膨胀

MORPH_ERODE – 腐蚀

MORPH_OPEN – 开运算(Opening operation)

MORPH_CLOSE – 闭运算(Closing operation)

MORPH_GRADIENT -形态学梯度(Morphological gradient)

MORPH_TOPHAT - “顶帽”(“Top hat”)

MORPH_BLACKHAT - “黑帽”(“Black hat“)

第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。

第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。

第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。

第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。

第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

调用范例:

Mat img = imread("dog.jpg");

Mat out1,out2;

Mat element = getStructuringElement(MORPH_RECT, Size(50, 50));

morphologyEx(img, out1, MORPH_OPEN, element);

morphologyEx(img, out2, MORPH_CLOSE, element);

namedWindow("dog1", 2);

imshow("dog1", out1);

namedWindow("dog2", 2);

imshow("dog2", out2);

waitKey(0);

这周的内容就是这些,下周见

opencv 核 腐蚀_OpenCV学习笔记(五)形态学操作:腐蚀、膨胀相关推荐

  1. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  2. opencv学习笔记五--文件扫描+OCR文字识别

    opencv学习笔记五--文件扫描+OCR文字识别 文件扫描 定义函数 边缘检测 获取轮廓 变换 OCR文字识别 环境配置 代码 文件扫描 # 导入工具包 import numpy as np imp ...

  3. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  4. Ethernet/IP 学习笔记五

    Ethernet/IP 学习笔记五 Accessing data within a device using a non-time critical message (an explicit mess ...

  5. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  6. 吴恩达《机器学习》学习笔记五——逻辑回归

    吴恩达<机器学习>学习笔记五--逻辑回归 一. 分类(classification) 1.定义 2.阈值 二. 逻辑(logistic)回归假设函数 1.假设的表达式 2.假设表达式的意义 ...

  7. 好程序员教程分析Vue学习笔记五

    好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...

  8. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  9. ROS学习笔记五:理解ROS topics

    ROS学习笔记五:理解ROS topics 本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具. 例子展示 roscore 首先运行roscore系列服务,这是使用R ...

最新文章

  1. pytorch 多GPU训练总结(DataParallel的使用)
  2. 用研究新范式破解生命科学难题
  3. 教你禁用右键,也教你如何破解
  4. express下使用ES6 - dtdxrk - 博客园
  5. 嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中
  6. js中 json对象与json字符串相互转换的几种方式
  7. 【22/04】Chrome 里的请求报错 “CAUTION: Provisional headers are shown“ 是什么意思?
  8. 2020年的5种常见骇客行为,你的电脑安全吗?
  9. kernel网络之RSS,RPS,RFS和XPS
  10. 在oracle包体中动态创建表 PKG
  11. html中如何使阴影正片叠底,两种方法让你的PPT做出「正片叠底」的效果!
  12. kafka对单分区重设偏移量
  13. flutter笔记 图片组件使用base64数据,数据格式报错
  14. Homework 1 : Knowledge items of C++ Answer (part 1)
  15. 基于GPT-4免费生成代码的工具!小游戏,管理系统都能生成!
  16. DBlink 入门案例
  17. Linux 系统修改环境变量的方法
  18. golang的个人学习笔记以及错题集
  19. access如何设置定期报表汇总_ACCESS最佳教程(报表的设置教学)
  20. uva12124 组装电脑

热门文章

  1. Android - Navigation组件
  2. 计算机专业考研真题,计算机专业考研真题讲解
  3. 在二十四节气中,冬至是个大节气,从冬至以后就开始数九啦一九二九不出手,
  4. OMI产品介绍(含气溶胶产品及数据下载读取方法)
  5. 物联网技术概论:1~7章汇总(西安交通大学)
  6. 花了我很长时间整理出来的绿色软件[小蓉整理]
  7. Python生成密码字典写入文件算法
  8. 7405 平台移植华为EC122上网卡
  9. Mybatis-plus使用过程中出现Invalid bound statement (not found):com.xxx.xxx.xxxMapper.selectList
  10. 如何创建网站?网站制作基本流程详解