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入门之七形态学图像处理:膨胀腐蚀的主要内容,如果未能解决你的问题,请参考以下文章