【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 }
时间: 2024-08-10 19:09:09

【opencv入门之七】形态学图像处理(一):膨胀、腐蚀的相关文章

OpenCV图像处理篇之腐蚀与膨胀

转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最基本的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算.腐蚀和膨胀的应用非常广泛,而且效果还很好: 腐蚀可以分割(isolate)独立的图像元素,膨胀用于连接(join)相邻的元素,这也是腐蚀和膨胀后图像最直观的展现 去噪:通过低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点 图像轮廓提取:腐蚀操作 图像分割 等等...(在文后给出一则简单实用膨胀操作提

opencv学习之路(14)、形态学之膨胀腐蚀(一)

一.膨胀腐蚀概述(对高亮部分进行操作) 二.膨胀 三.腐蚀 四.代码 1.查看结构元素 1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 void main(){ 7 Mat element=getStructuringElement(MORPH_RECT,Size(5,5)); 8 Mat element2=getStructur

系列文章 -- OpenCV入门教程

<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之十七]OpenCV重映射 & SURF特征点检测合辑 [OpenCV入门教程之十六]OpenCV角点检测之Harris角点检测 [OpenCV入门教程之十五]水漫金山:OpenCV漫水填充算法(Floodfill) [OpenCV入门教程之十四]OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑 [Ope

学习 opencv---(10)形态学图像处理(2):开运算,闭运算,形态学梯度,顶帽,黒帽合辑

上篇文章中,我们重点了解了腐蚀和膨胀这两种最基本的形态学操作,而运用这两个基本操作,我们可以实现更高级的形态学变换. 所以,本文的主角是OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算.形态学梯度."顶帽"."黑帽"等等. 第二件事,是浅墨想跟大家做一个关于OpenCV系列文章的书写内容和风格的思想汇报. 是这样的,浅墨发现最近几期写出来的文章有些偏离自己开始开这个专栏的最初的愿望--原理和概念部分占的

史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等. 你将需要两个主要的库,第三个可选:python-OpenCV,Numpy 和 Matplotlib. Windows 用户: python-OpenCV:有其他的方法,但这是最简单的. 下载相应的 wheel(.whl)文件

【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会造成内存泄露.而且用起来超级麻烦,我们往往在debug的时候,很大一部分时间在纠结手动释放内存的问题.虽然对于小型的程序来说手动管理内存不是问题,但一旦我们写的代码变得越来越庞大,我们便会开始越来越多地纠缠于内存管理的问题,而不是着力解决你的开发目标. 这,就有些舍本逐末的感觉了. 而自从OpenCV踏入2.0时代,用Mat

【OpenCV入门教程之十七】OpenCV重映射 &amp; SURF特征点检测合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

OpenCV 入门示例之五:一个复杂点的变换

前言 前文介绍了一个简单的变换.需要注意的是,很多时候,输出和输入图像的格式是不同的( 大小,深度,通道 ).在本文将展示的程序中,对图像进行了缩放( 使用cvPyrDown 函数 ),这种情况下需要先定制好输出图像的格式,然后再将其与输入图像一起传递进缩放函数. 代码示例 1 // 此头文件包含图像IO函数的声明 2 #include "highgui.h" 3 // 此头文件包含基本的图像处理函数和高级计算机视觉算法 4 #include "cv.h" 5 6

OpenCV入门

此系列文章只是OpenCV tutorials的学习和总结. 网址:http://docs.opencv.org/doc/tutorials/tutorials.html 基础OpenCV入门包括以下内容: OpenCV介绍---------------------------------学习如何安装OpenCV. core模块,核心功能---------------------------学习基础模块,操作图像等. imgproc模块,图像处理-----------------------学习