OpenCV 系列 --- 形态学操作(膨胀、腐蚀)

原创 2016年08月28日 17:44:27

形态学操作是基于形状的一系列图像处理操作,基本的运算包括:腐蚀、膨胀、开、闭等。在进行其他算法研发时,我基本只用膨胀与腐蚀操作,因此本文只介绍这两种操作,其他的可以相似地进行。

关键点

  1. 操作是对图像中的高亮区域进行的,比如膨胀,就是将图像中的高亮区域扩大。
  2. 它们可以达到的目的
    • 去除噪声
    • 分离出独立的元素或者连接独立的元素
    • 可以求图像梯度或者图像中的小洞

测试用图

为了更加清晰地显示出操作前后的差距,采用如下图所示的二值图
这里写图片描述
一定要注意,形态学操作不光可以用在二值图,也可以用在灰度图,甚至可以用在彩色图。

基本原理

  1. 膨胀
    膨胀就是利用一个核(叫做结构元素)与图像进行卷积。随着核的移动,每次都取核覆盖区域的最大像素值,因此最终完成的效果是将高亮区域扩大。
  2. 腐蚀
    同样地,腐蚀也是卷积操作。随着核的移动,每次都取核覆盖区域的最小像素值,因此最终完成的效果是将高亮区域缩小。

代码示例

以下代码是OpenCV文档中给出的一段代码,比较能说明问题,我加了一些注释

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "highgui.h"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/// 全局变量
Mat src, erosion_dst, dilation_dst;

int erosion_elem = 0;
int erosion_size = 0;
int dilation_elem = 0;
int dilation_size = 0;
int const max_elem = 2;
int const max_kernel_size = 21;

/** Function Headers */
void Erosion( int, void* );//腐蚀操作
void Dilation( int, void* );//膨胀操作

/** @function main */
int main()
{
  /// Load an image
  src = imread("coins.png");

  if( !src.data )
  { 
      return -1; 
  }

  /// Create windows
  namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE );
  namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );

//Element:\n 0: Rect \n 1: Cross \n 2: Ellipse

  /// 腐蚀操作滚动条
  createTrackbar( "Element:", "Erosion Demo",&erosion_elem, max_elem,Erosion );
  createTrackbar( "Kernel", "Erosion Demo",&erosion_size, max_kernel_size,Erosion );

  /// 膨胀操作滚动条
  createTrackbar( "Element:", "Dilation Demo",&dilation_elem, max_elem,Dilation );
  createTrackbar( "Kernel", "Dilation Demo",&dilation_size, max_kernel_size,Dilation );

  // 开始
  Erosion( 0, 0 );
  Dilation( 0, 0 );

  waitKey(0);
  return 0;
}

/**  @function Erosion  */
void Erosion( int, void* )
{
  int erosion_type;

  if( erosion_elem == 0 ) 
  {  
      erosion_type = MORPH_RECT;  //矩形结构元素
  }
  else if( erosion_elem == 1 ) 
  { 
      erosion_type = MORPH_CROSS;  //十字结构元素
  }
  else if( erosion_elem == 2) 
  {
      erosion_type = MORPH_ELLIPSE;//椭圆结构元素
  }

//生成核(结构元素)
  Mat element = getStructuringElement( erosion_type,Size( 2*erosion_size + 1, 2*erosion_size+1 ),
                                       Point( erosion_size, erosion_size ) );

  //腐蚀操作
  erode( src, erosion_dst, element );
  imshow( "Erosion Demo", erosion_dst );
}

/** @function Dilation */
void Dilation( int, void* )
{
  int dilation_type;

  if( dilation_elem == 0 ) 
  { 
      dilation_type = MORPH_RECT; //矩形结构元素
  }
  else if( dilation_elem == 1 ) .
  { 
      dilation_type = MORPH_CROSS; //十字结构元素
  }
  else if( dilation_elem == 2)
  { 
      dilation_type = MORPH_ELLIPSE; //椭圆结构元素
  }

//生成核(结构元素)
  Mat element = getStructuringElement( dilation_type,Size(2*dilation_size + 1, 2*dilation_size+1 ),
                                       Point( dilation_size, dilation_size ) );
  //腐蚀操作
  dilate( src, dilation_dst, element );
  imshow( "Dilation Demo", dilation_dst );
}

结果

  1. 采用7*7矩形结构元素
    这里写图片描述
    左图是腐蚀、右图为膨胀。可以看出,腐蚀缩小了白色(高亮)区域,而膨胀扩大了白色区域。
  2. 采用十字结构元素,大小为7,结果如下
    这里写图片描述
    左图是腐蚀、右图为膨胀。可以看出,腐蚀缩小了白色(高亮)区域,而膨胀扩大了白色区域。
  3. 采用椭圆结构元素,大小为15,结果如下
    这里写图片描述

可以看出,当白色区域为圆形时,采用椭圆形的结构元素生成的结果较为规则,圆形结构保持较为完整。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀

形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。 数学形态学(Math...
  • zhmxy555
  • zhmxy555
  • 2014年04月14日 23:12
  • 99704

openCV 形态学 腐蚀、膨胀、开操作和比操作、形态梯度 、顶帽、黑帽

 一、opencv几个形态学函数定义        形态学函数的头文件:#include        函数定义如下: [cpp] view plaincopyprint...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015年04月21日 10:47
  • 1762

python opencv形态学变换:腐蚀与膨胀

在学习这一部分之前,我们必须先有个明确的膨胀和腐蚀的概念,就上图而言,膨胀和腐蚀都是针对白色部分而不是黑色部分,膨胀就是白色区域扩大,腐蚀就是白色区域缩小 1、腐蚀 要进行腐蚀操作,我们要...
  • qq_37213964
  • qq_37213964
  • 2017年10月22日 16:12
  • 279

形态学中的腐蚀 膨胀 开关操作

内容摘自:http://blog.csdn.net/cay22/article/details/5574159   形态学运算中腐蚀,膨胀,开运算和闭运算。 1. 腐蚀是一种消除边界点,使边界向...
  • bookwormno1
  • bookwormno1
  • 2012年11月16日 19:10
  • 731

OpenCv学习笔记(五)-数学形态学2(灰度级膨胀和腐蚀及c语言实现)

一 基本概念 所谓的灰度级膨胀和腐蚀即将而知图像的二值形态学运算推广到灰度图像上。对于一幅图像的腐蚀(膨胀)运算定义为对每个像素赋值为某个领域内输入图像灰度级的最小(或最大值)。在二值变换中的...
  • Augusdi
  • Augusdi
  • 2013年05月02日 16:31
  • 5098

opencv图像的形态学操作:腐蚀与膨胀

cv::getStructuringElement Mat getStructuringElement(int shape, Size esize, Point anchor=Point(-1, ...
  • longwinyang
  • longwinyang
  • 2016年08月29日 08:46
  • 1040

二值图像--形态学处理2 腐蚀和膨胀

学习DIP第12天 开篇废话     今天来介绍形态学中最基础也是最重要的两个操作,腐蚀和膨胀,腐蚀和膨胀基本上是所有形态学操作的基础,除此之外还有补集(即二值图全部取反的操作,0变1,1变0),和反...
  • TonyShengTan
  • TonyShengTan
  • 2014年12月25日 19:47
  • 6719

形态学:膨胀与腐蚀

向浅墨学习。 本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qia...
  • xia316104
  • xia316104
  • 2015年03月30日 11:19
  • 6630

opencv自定义核进行膨胀和腐蚀操作

#include "stdio.h" #include "opencv2/opencv.hpp" #include "opencv2/core/core.hpp" #include "openc...
  • woniu199166
  • woniu199166
  • 2016年08月18日 15:57
  • 264

图像处理(六)灰度形态学腐蚀与膨胀

灰度图像的腐蚀运算的数学定义为: 其中,g(x,y)为腐蚀后的灰度图像,f(x,y)为原灰度图像,B为结构元素。 用自然语言描述即:           腐蚀运算是由结构元素确定的邻...
  • guoyk1990
  • guoyk1990
  • 2012年10月31日 21:05
  • 12418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV 系列 --- 形态学操作(膨胀、腐蚀)
举报原因:
原因补充:

(最多只允许输入30个字)