深度学习-推荐系统-CV-NLP深度学习·神经网络·计算机视觉机器学习与计算机视觉

形态学分析学习笔记

2019-08-07  本文已影响16人  开飞机的乔巴

本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。

学习笔记目录----->传送门 <-----

前言

有关形态学分析的文章,网络上有很多,形态学分析的一些基础知识也比较简单。在这里为什么还要重复写呢?既然是学习笔记,主要还是想把自己学习的过程记录下来,为以后查看和回忆留下一份记录,也与大家共享我的学习过程,愿对各位同学有益,而不仅仅是为了写文章而写文章。闲话不多说,进入正题。

形态学分析简介

首先我们简要介绍一下什么是形态学?

先不管上面的定义,我们接下来看。在图像处理中,我们更严格的说应该是数学形态学,那么什么是数学生态学?

通常,形态学处理有两个输入,一个输出:

根据处理原图像以及方法的不同,我们大概分为三类数学形态学:二值数学形态学、灰度数学形态学、模糊数学形态学。在表面上理解其不同:二值数学形态学主要作用在二值空间,灰度数学形态学是从二值空间延伸到灰度空间,模糊数学形态学是将模糊集合理论用于数学形态学,是从二值逻辑向模糊逻辑的推广,主要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以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。

上一篇 下一篇

猜你喜欢

热点阅读