opencv入门之七形态学图像处理:膨胀腐蚀

Posted Haven_zhf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv入门之七形态学图像处理:膨胀腐蚀相关的知识,希望对你有一定的参考价值。

参考网站:

http://blog.csdn.net/poem_qianmo/article/details/23710721

 

1、形态学(morphology)概述

  数学形态学(Mathematical morphplogy)是数学形态学图像处理的基本理论。其基本的运算包括:

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

  最基本的两种是:腐蚀和膨胀。其两的主要功能有:

    • 消除噪声
    • 分割(isolate)出独立的图像元素,在图像中链接(join)相邻的元素
    • 寻找图像中的明显的极大值区域或极小值区域
    • 求出图像的梯度

  腐蚀就是原图中的高亮部分被腐蚀,膨胀就是原图中的高亮部分被膨胀。

 

2、形态学膨胀——dilate函数

void dilate(  
    InputArray src,  
    OutputArray dst,  
    InputArray kernel,          //膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3*3的核
                        一般使用getStructuringElement配合这个参数的使用
Point anchor
=Point(-1,-1),     // 锚点的位置 int iterations=1,          //迭代使用erode()函数的次数 int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() );

  getStructuringElement函数:

1 int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸  
2    
3 //获取自定义核  
4 Mat element = getStructuringElement(MORPH_RECT,                //表示内核的形状
5     Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),    //表示内核的尺寸
6     Point( g_nStructElementSize, g_nStructElementSize ));      //锚点的位置

  其中第一个参数可以选择:

    • 矩形:MORPH_RECT
    • 交叉形:MORPH_CROSS
    • 椭圆形:MORPH_ELLIPSE

  一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获取getStructuringElement函数的返回值。调用完这个函数后,就可以接下来调用erode或dilate函数了。

1   //载入原图   
2     Mat image = imread("1.jpg");  
3   //获取自定义核  
4     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
5     Mat out;  
6     //进行膨胀操作  
7     dilate(image, out, element);  

 

 

 

3、形态学腐蚀——erdoe函数:

1 void erode(  
2     InputArray src,  
3     OutputArray dst,  
4     InputArray kernel,  
5     Point anchor=Point(-1,-1),  
6     int iterations=1,  
7     int borderType=BORDER_CONSTANT,  
8     const Scalar& borderValue=morphologyDefaultBorderValue()  
9  );  
1    //载入原图   
2     Mat image = imread("1.jpg");  
3    //获取自定义核  
4     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
5     Mat out;  
6     //进行腐蚀操作  
7     erode(image,out, element);  

 

 

4、综合实践:

  1 //******************************【程序说明】*****************************
  2 //    程序名称:形态学图像处理(一):膨胀、腐蚀
  3 //    opencv版本:2.4.13
  4 //    日期:2017/9/21
  5 //**********************************************************************
  6 
  7 
  8 //******************************【头文件包含部分】*****************************
  9 //    描述:包含程序所依赖的头文件
 10 //*****************************************************************************
 11 #include <opencv2/core/core.hpp>
 12 #include <opencv2/highgui/highgui.hpp>
 13 #include <opencv2/imgproc/imgproc.hpp>
 14 #include <iostream>
 15 
 16 
 17 //******************************【命名空间声明部分】*****************************
 18 //    描述:包含程序所使用的命名空间
 19 //*****************************************************************************
 20 using namespace std;
 21 using namespace cv;
 22 
 23 
 24 //******************************【全局变量声明部分】*****************************
 25 //    描述:全局变量声明
 26 //*****************************************************************************
 27 Mat g_srcImage,g_dstImage;    //原始图、效果图
 28 int g_nTrackbarNumer = 0;    //0表示腐蚀erode,1表示膨胀dilate
 29 int g_nStructElementSize = 3;    //结构元素(内核矩阵)的尺寸
 30 
 31 
 32 //******************************【全局函数声明部分】*****************************
 33 //    描述:全局函数声明
 34 //*****************************************************************************
 35 void Process();    //膨胀和腐蚀的处理函数
 36 void on_TrackbarNumChange ( int, void* );    //回调函数
 37 void on_ElementSizeChange( int, void* );    //回调函数
 38 
 39 
 40 //******************************【main()部分】*****************************
 41 //    描述:控制台应用程序的入口函数,我们的程序从这里开始
 42 //*****************************************************************************
 43 int main()
 44 {
 45     //【0】初始化
 46     system("color 5E");
 47 
 48     //【1】读取原图
 49     g_srcImage = imread( "1.jpg", 1 );
 50     if(!g_srcImage.data) { printf("Oh,no,读取srcImage错误!!!!\n"); return false; }
 51 
 52     //【2】显示原图
 53     namedWindow("【<0>原图窗口】", 1 );
 54     imshow("【<0>原图窗口】", g_srcImage );
 55 
 56     //【3】进行初次腐操作并显示效果图
 57     namedWindow("【<1>腐蚀/膨胀效果图】", 1);
 58     Process();
 59 
 60     //【4】创建轨迹条
 61     createTrackbar( "腐蚀/膨胀", "【<1>腐蚀/膨胀效果图】", &g_nTrackbarNumer, 1, on_TrackbarNumChange );
 62     createTrackbar( "内核尺寸", "【<1>腐蚀/膨胀效果图】", &g_nStructElementSize, 21, on_ElementSizeChange );
 63     
 64     //【5】输出一些有帮助的信息
 65     cout<<endl<<"\t嗯。好了,请调整滚动条观察图像效果~\n\n"
 66                 <<"\t按下“q”键时,程序退出~!\n";
 67 
 68     //【6】按下“q”键时,程序退出
 69     while(char(waitKey(1) != q)){}
 70 
 71     return 0;
 72 }
 73 
 74 
 75 //******************************【Process()部分】*****************************
 76 //    描述:进行自定义的腐蚀和膨胀操作
 77 //*****************************************************************************
 78 void Process()
 79 {
 80     //获取自定义核
 81     Mat element = getStructuringElement(MORPH_RECT, 
 82                                             Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1 ),
 83                                             Point( g_nStructElementSize, g_nStructElementSize ) );
 84     //进行腐蚀 或 膨胀操作
 85     if(g_nTrackbarNumer == 0)
 86         erode(g_srcImage, g_dstImage, element);
 87     else
 88         dilate(g_srcImage, g_dstImage, element);
 89 
 90     //显示效果图
 91     imshow("【<1>腐蚀/膨胀效果图】", g_dstImage);
 92 }
 93 
 94 
 95 //******************************【on_TrackbarNumChange()部分】*****************************
 96 //    描述:腐蚀和膨胀之间【切换开关】时的回调函数
 97 //*****************************************************************************
 98 void on_TrackbarNumChange ( int, void* )
 99 {
100     //腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
101     Process();
102 }
103 
104 //******************************【on_ElementSizeChange()部分】*****************************
105 //    描述:腐蚀和膨胀操作【内核改变】时的回调函数
106 //*****************************************************************************
107 void on_ElementSizeChange( int, void* )
108 {
109     //内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
110     Process();
111 }

 

以上是关于opencv入门之七形态学图像处理:膨胀腐蚀的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 形态学操作:膨胀与腐蚀

OpenCV 形态学操作:膨胀与腐蚀

学习 opencv---形态学图像处理:膨胀和腐蚀

OpenCV 图像处理(形态学滤波:腐蚀与膨胀,开运算闭运算形态学梯度顶帽黑帽)

OpenCV2:大学篇 形态学技术-腐蚀与膨胀操作

youcans 的 OpenCV 例程200篇136. 灰度腐蚀和灰度膨胀