本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。
学习笔记目录----->传送门 <-----
前言
有关形态学分析的文章,网络上有很多,形态学分析的一些基础知识也比较简单。在这里为什么还要重复写呢?既然是学习笔记,主要还是想把自己学习的过程记录下来,为以后查看和回忆留下一份记录,也与大家共享我的学习过程,愿对各位同学有益,而不仅仅是为了写文章而写文章。闲话不多说,进入正题。
形态学分析简介
首先我们简要介绍一下什么是形态学?
- 形态学是用来特指一门专门研究生物形式的本质的学科。这门形态学同那种把有机体的生物分解成各个单元的解剖学不同,不是只注重部分的微观分析而忽略了总体上的联系,相反它要求把生命形式当作有机的系统看待形态学的方法。(我是谁,这是什么,我进到哪里了,跟图像处理有什么关系)
先不管上面的定义,我们接下来看。在图像处理中,我们更严格的说应该是数学形态学,那么什么是数学生态学?
- 数学形态学是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。具体操作就是在每个像素位置上与图像对应的区域进行特定的逻辑运算,输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。结构元素就是一个图像,作为分析图像时使用的"探针",代表当处理影像上的某点时、要取出周围的哪些点进行运算,在图像处理中,我们也称它为滤波核或者核。核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。(不懂,没关系,看下面具体的操作介绍)
通常,形态学处理有两个输入,一个输出:
- 输入:原图像,核
- 输出:形态学变换后的图像
根据处理原图像以及方法的不同,我们大概分为三类数学形态学:二值数学形态学、灰度数学形态学、模糊数学形态学。在表面上理解其不同:二值数学形态学主要作用在二值空间,灰度数学形态学是从二值空间延伸到灰度空间,模糊数学形态学是将模糊集合理论用于数学形态学,是从二值逻辑向模糊逻辑的推广,主要n维空间目标物体的形状特征和形态变换。(初次接触,可能敢描述的有点空)
常见的形态学操作:
- 腐蚀
- 膨胀
- 开运算
- 闭运算
- 形态学梯度
- 顶帽、黑帽、骨架抽取、极限腐蚀、击中击不中变换、颗粒分析、流域变换等
形态学处理主要的应用的场景有:边缘检测、图像分割、图像细化以及噪声滤除等。
下面我们解释一下其中的基本的操作:腐蚀、膨胀、开运算、闭运算、形态学梯度,其他操作我们在其他文章中单独操作。
我是画风调剂师
形态学操作详解
本段将详细的描述一些基本的操作,看完这段的描述以及演示,应该会对上面的定义有新的认识。
膨胀
膨胀就是求局部最大值的操作,核(结构)B与图形(结构A)卷积,即计算核B覆盖的区域(体现局部)的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。从上图中可以看出经过膨胀操作后A好像在边缘长了一圈,这也是膨胀的基本效果。
用(x, y)周边区域(这个区域的大小形状由核来决定)(x+x', y+y')内的最大值代替(x, y)的值。
之后我们在代码部分,看一下膨胀对二值图片和对灰度图片的不同效果。
腐蚀
腐蚀是膨胀额反操作,膨胀是求局部最大值,而腐蚀是求局部最小值,并赋予该点。从上图中可以看出经过腐蚀操作后A好像在边缘瘦了一圈,这也是腐蚀的基本效果。
用(x, y)周边区域(这个区域的大小形状由核来决定)(x+x', y+y')内的最小值代替(x, y)的值。
之后我们在代码部分,看一下腐蚀对二值图片和对灰度图片的不同效果。
突然发现腐蚀是好像把边缘去掉了,要是只保存去掉的是不是就是边缘呢?我们接下来看。
开运算
开运算的过程就是先进行腐蚀操作后膨胀操作。开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。也比较容易想出来起效果,先腐蚀把那些小点,和边缘出都腐蚀丢了,然后经过膨胀却只能恢复边缘处,小的点却没有了。
闭运算
闭运算的过程就是先进行膨胀操作后进行腐蚀操作。闭运算可以用来填补小的黑色空洞。大家可以按照开运算的想法想一下。
形态学梯度
形态学梯度操作就是将膨胀结果图与腐蚀结果图做查的结果,也就是膨胀图与腐蚀图之差,通常用来保留边缘轮廓,但这不是边缘轮廓识别。
这些操作大概的概念和作用基本上有了了解,接下来我们就看看其效果如何吧。
OpenCV 使用形态学分析效果展示[代码]
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char *argv[])
{
{
cv::Mat orignal_binary_image = cv::imread (argv[1]);
cv::Mat binary_image, erode_binary_iamge ,dilate_binary_iamge,open_binary_iamge,close_binary_iamge,gradient_binary_iamge;
cv::threshold(orignal_binary_image, binary_image, 100, 255, cv::THRESH_BINARY); //转化为二值图像
cv::imwrite("orignal_binary_iamge.png",binary_image);
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)); //初始化滤波核
cv::erode(binary_image, erode_binary_iamge, element); //膨胀操作
cv::dilate(binary_image,dilate_binary_iamge,element); //腐蚀操作
cv::morphologyEx(binary_image,open_binary_iamge, cv::MORPH_OPEN, element); //开运算
cv::morphologyEx(binary_image,close_binary_iamge, cv::MORPH_CLOSE, element); //闭运算
cv::morphologyEx(binary_image,gradient_binary_iamge, cv::MORPH_GRADIENT, element);//形态学梯度
//保存结果
cv::imwrite("erode_binary_iamge.png",erode_binary_iamge);
cv::imwrite("dilate_binary_iamge.png",dilate_binary_iamge);
cv::imwrite("open_binary_iamge.png",open_binary_iamge);
cv::imwrite("close_binary_iamge.png",close_binary_iamge);
cv::imwrite("gradient_binary_iamge.png",gradient_binary_iamge);
}
{
cv::Mat color_image = cv::imread (argv[2]);
cv::Mat erode_color_iamge ,dilate_color_iamge,open_color_iamge,close_color_iamge,gradient_color_iamge;
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(10, 10));
cv::erode(color_image, erode_color_iamge, element);
cv::dilate(color_image,dilate_color_iamge,element);
cv::morphologyEx(color_image,open_color_iamge, cv::MORPH_OPEN, element);
cv::morphologyEx(color_image,close_color_iamge, cv::MORPH_CLOSE, element);
cv::morphologyEx(color_image,gradient_color_iamge, cv::MORPH_GRADIENT, element);
cv::imwrite("erode_color_iamge.png",erode_color_iamge);
cv::imwrite("dilate_color_iamge.png",dilate_color_iamge);
cv::imwrite("open_color_iamge.png",open_color_iamge);
cv::imwrite("close_color_iamge.png",close_color_iamge);
cv::imwrite("gradient_color_iamge.png",gradient_color_iamge);
}
return 0;
}
下面是二值图像的效果
| 原图 | 腐蚀 | 膨胀 |
|---|---|---|
|
|
|
| 开运算 | 闭运算 | 形态学梯度 |
|
|
|
下面是彩色图像的效果
| 原图 | 腐蚀 | 膨胀 |
|---|---|---|
|
|
|
| 开运算 | 闭运算 | 形态学梯度 |
|
|
|
对不起了娜美桑,为了让你出境,都把你照片给毁了,向你道歉,还在忏悔中,就不解释图像效果了,大家自己看吧。
重要的事情说三遍:
如果您看到我的文章对您有所帮助,那就点个赞呗 ( * ^ __ ^ * )
如果您看到我的文章对您有所帮助,那就点个赞呗( * ^ __ ^ * )
如果您看到我的文章对您有所帮助,那就点个赞呗( * ^ __ ^ * )
任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。博客地址:开飞机的乔巴
作者简介:开飞机的乔巴(WeChat:zhangzheng-thu),现主要从事机器人抓取视觉系统以及三维重建等3D视觉相关方面,另外对slam以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。












网友评论