个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-10.html

数学形态学

数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。

数学形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有2个基本的运算,即腐蚀和膨胀,而腐蚀和膨胀通过结合又形成了开运算和闭运算。 开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。本文介绍二值形态学变换。

二值形态学变换

二值形态学变换就是对二值图像进行数学形态学操作。常用操作有腐蚀、膨胀、开运算、闭运算等。腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。 膨胀就是图像中的高亮部分进行膨胀,“邻域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中高亮部分被腐蚀,“邻域被蚕食”,效果图拥有比原图更小的高亮区域。

腐蚀

腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。。

腐蚀的数学表达式为:

该式子表示用结构B腐蚀A,需要在B中定义一个参考点。B像在A上面移动(如图像卷积操作一般)。

1. 用结构元素,扫描图像的每一个像素

2. 用结构元素与其覆盖的二值图像做“与”操作

3. 如果都为1,结果图像的该像素为1。否则为0

也就是查找被处理图像中能不能找到和结构元素相同的矩阵。如果存在那么中心点所对应的点就为1,否则为0.下图为腐蚀操作的示意图:

代码实现:

Mat ErosionTransform(Mat &src,int kernelSize)
{Mat dst(src.rows, src.cols, src.type(), Scalar(0));Mat kernel = Mat::ones(kernelSize, kernelSize, CV_8UC1);if (src.channels() == 1) {int rowsSub = int(kernel.rows / 2);int colsSub = int(kernel.cols / 2);for (int i = rowsSub; i < src.rows-rowsSub; i++) {for (int j = colsSub; j < src.cols-colsSub; j++){int flag = 0;for (int ki = 0; ki < kernel.rows; ki++){for (int kj = 0; kj < kernel.cols; kj++){int i_ = i+ki - rowsSub;int j_ = j+kj - colsSub;if (src.at<uchar>(i_, j_) == 0 && kernel.at<uchar>(ki, kj) >0)flag = 1;}}if(!flag)dst.at<uchar>(i, j) = 255;elsedst.at<uchar>(i, j) = 0;}}}return dst;
}

说明:

当输入的核是一个3x3的全1矩阵时,运行效果图如下:

膨胀

膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。

膨胀的公式如下:

膨胀是和腐蚀运算相反的操作,膨胀的步骤如下:

1. 用结构元素,扫描图像的每一个像素

2. 用结构元素与其覆盖的二值图像做“与”操作

3. 如果都为0,结果图像的该像素为0。否则为1

也就是在结构元素覆盖范围下,只要有一个像素符和结构元素像素相同,那么中心点对应点就为1,否则为0.

代码实现如下:

Mat DialateTransform(Mat &src, int kernelSize)
{Mat dst(src.rows, src.cols, src.type(), Scalar(0));Mat kernel = Mat::ones(kernelSize, kernelSize, CV_8UC1);if (src.channels() == 1) {int rowsSub = int(kernel.rows / 2);int colsSub = int(kernel.cols / 2);for (int i = rowsSub; i < src.rows - rowsSub; i++) {for (int j = colsSub; j < src.cols - colsSub; j++){int flag = 0;for (int ki = 0; ki < kernel.rows; ki++){for (int kj = 0; kj < kernel.cols; kj++){int i_ = i + ki - rowsSub;int j_ = j + kj - colsSub;if (src.at<uchar>(i_, j_) >0 && kernel.at<uchar>(ki, kj) >0)flag = 1;}}if (!flag)dst.at<uchar>(i, j) =0;elsedst.at<uchar>(i, j) = 255;}}}return dst;
}

当kernelSize=3时,运行效果图如下:

闭运算

闭运算是使用同一结构元对图像进行先膨胀后腐蚀的操作,可以用来弥合较窄的间断和细长的沟壑,消除物体间小的孔洞,填补轮廓线中的断裂。

闭运算=先进行膨胀运算,在进行腐蚀运算,其运行示意图如下,

代码实现:

Mat ClosingTransform(Mat &src, int kernelSize)
{Mat dialateImg = DialateTransform(src, kernelSize);return ErosionTransform(dialateImg, kernelSize);
}

开运算

开运算是使用同一结构元对图像进行先腐蚀后膨胀的操作,可以用来平滑物体的轮廓,断开物体间较窄的连接,消除物体边沿尖锐的突出部分。

开运算 = 先腐蚀运算,再膨胀运算.示意图如下:

代码实现:

Mat OpeningTransform(Mat &src, int kernelSize)
{Mat erosionImg = ErosionTransform(src, kernelSize);return DialateTransform(erosionImg, kernelSize);
}kernelSize=5

参考文献

[1] 百度百科.数学形态学.https://baike.baidu.com/item/%E6%95%B0%E5%AD%A6%E5%BD%A2%E6%80%81%E5%AD%A6/2594174.

[2]CSDN博客:chaolei_9527. 数学形态学运算——腐蚀、膨胀、开运算、闭运算.https://blog.csdn.net/chaolei3/article/details/79618602.2018-03-20

[3]CSDN博客:青雲-吾道乐途. 膨胀与腐蚀的彻底击破.https://blog.csdn.net/qq_37059483/article/details/77878829.2017-09-07

[4]CSDN博客:HanShanBuLeng. 形态学应用——图像开运算与闭运算.https://blog.csdn.net/hanshanbuleng/article/details/80657148.2018-06-11

图像处理-二值形态学运算相关推荐

  1. 什么叫做形态学图像处理_数字图像处理在二值形态学及其灰度形态学方面的应用.ppt...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp图形图像 数字图像处理在二值形态学及其灰度形态学方面的应用.pp ...

  2. 数字空间中的二值形态学

    数字空间中的二值形态学 Binary Morphology in Digital Space Herry Herry 摘要:数学形态学作为图象处理与分析的基本理论和方法在视觉检测.生物医学图象分析.机 ...

  3. 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除

    9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 文章目录 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 1 算法原理 2 代码 3 效果 1 ...

  4. 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充

    9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 文章目录 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 1 算法原理 2 代码 3 效果 1 ...

  5. 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀、膨胀、开启、闭合)

    9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 文章目录 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 1 算法原理 1.1 ...

  6. 【医学图像处理】9 二值形态学

    形态学及二值操作 1 形态学相关概念 2 二值形态学操作 2.1 二值膨胀 2.2 二值腐蚀 2.3 二值开操作 2.4 二值闭操作 2.5 二值形态学总结 3 二值形态学应用 1 形态学相关概念   ...

  7. 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测

    9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 文章目录 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 1 算 ...

  8. 数字图像处理三 | 二值形态学操作(Distance Transform, 骨架提取,Conditional Dilation)的原理及Python实现

    图像处理总结3 文末有代码链接. 二值形态学 形态学起源于法国巴黎高等矿业学院,因为人家是搞地质的. 可见一斑,形态学的精要就是在于将图像看作是等高线组成的地形图,他的基本操作就是动土,平高填低等等. ...

  9. 二值形态学操作、图像的边缘检测、图像编码

    实验五 二值形态学操作 一.实验目的  了解二值形态学的基本运算  掌握基本形态学运算的Matlab实现  了解形态操作的应用 二.原理     收缩和膨胀是数学形态学最基本的变换,数学形态学的 ...

最新文章

  1. 直接上手!不容错过的Visual Studio Code十大扩展组件
  2. SAP WM初阶根据Group Number来查询与之有关的TO单
  3. IOS 打包证书签名 shell脚本
  4. 矩阵学习摘记,欢迎指正
  5. 修正TiAnlogDisplay显示的问题
  6. linux下用tcpdump抓包
  7. HTML:网页设计案例1
  8. 达摩达兰论估价pdf_故事与估值epub+azw3+mobi文字版pdf+txt多看word魔鸠搜雅书屋
  9. 百度SEO站群超简约实惠的个人简历模板源码
  10. BZOJ 3689 异或之
  11. 【程序人生】外包公司派遣到网易,上班地点网易大厦,转正后工资8k-10k,13薪,包三餐,值得去吗?
  12. OSChina 周二乱弹 —— 糟糕 是喵动的感觉
  13. Linux shell 用sed删除第一行、最后一行或增加删除某行
  14. 抓取图片拼接成全景图
  15. 华为设备配置Telnet与SSH服务实现运程连接网络设备
  16. Amazon EC2云计算体验
  17. 苹果开发者账号/AppleID如何更改绑定的手机号
  18. 创建TimesTen 数据库
  19. JAVA日记之SpringJdbcTemplate/声明式事务控制 ----喝最烈的酒.
  20. python抽荣耀水晶_王者荣耀:关于荣耀水晶免费抽的教程,会上当的一定是这3类人!...

热门文章

  1. java mbean获取堆信息_实时取得虚拟机类信息、内存信息、MXBean的使用方法
  2. java spi技术,Java SPI机制
  3. web前端之HTML
  4. https://www.npmjs.com/package/lifecycle-webpack-plugin
  5. thinkphp3.2笔记(1)目录,控制器及url模式,地址解析
  6. 【统计学习】随机梯度下降法求解感知机模型
  7. BZOJ 2565: 最长双回文串
  8. Html-Css标签lable中定义宽度需要其他的支持
  9. android 升级数据库 修改表结构
  10. 刷新SOTA ! 视频恢复的重中之重:时间对齐!