前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【OpenCV入门十七讲】形态学操作

【OpenCV入门十七讲】形态学操作

作者头像
小白学视觉
发布2019-05-31 16:35:17
6280
发布2019-05-31 16:35:17
举报

小白导读

学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉得有帮助,请点击一下文末的“在看”鼓励一下小白。

膨胀与腐蚀(Dilation与Erosion)

图像形态学操作

  • 图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
  • 形态学有四个基本操作:腐蚀、膨胀、开、闭
  • 膨胀与腐蚀是图像处理中最常用的形态学操作手段
  • 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。

膨胀与腐蚀能实现多种多样的功能,主要如下:

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

相关函数

代码语言:javascript
复制
getStructuringElement(int shape, Size ksize, Point anchor)
  • shapr:形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
  • ksize:大小
  • anchor:锚点 默认是Point(-1, -1)意思就是中心像素

1. 形态学操作-膨胀

跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

形态学操作-膨胀(感官上图像变细,变白了)

相关函数

代码语言:javascript
复制
dilate(src, dst, kernel);

2. 形态学操作-腐蚀

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值

形态学操作-腐蚀(感官上图像变粗,变黑了)

相关函数

代码语言:javascript
复制
erode(src, dst, kernel)

代码示例

代码语言:javascript
复制
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;

Mat src,erode_dst,dilate_dst;
char input_Win[]="input windows",dilate_Win[]="Dilation windows",Erode_Win[]="Erosion windows";
int dilate_elem=0,erode_elem=0;
int dilate_size=0,erode_size=0;
int const max_elem=2;
int const max_kernel_size=21;

void Dilation(int,void*);//膨胀
void Erosion(int,void*);//腐蚀

int main(int argc,char** argv){
  //1、加载图像,可以是BGR或灰度
  src = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
  if(src.empty()){
    printf("Could not load Image ...");
    return -1;
  }

  namedWindow(input_Win,CV_WINDOW_AUTOSIZE);
  imshow(input_Win,src);
  
  //2、创建两个窗口(一个用于膨胀Dilation,另一个用于侵蚀Erosion)
  //每次移动任何滑块时,都会调用用户的Erosion或Dilation函数,它将根据当前的trackbar值更新输出图像。
  namedWindow(dilate_Win,CV_WINDOW_AUTOSIZE);
  namedWindow(Erode_Win,CV_WINDOW_AUTOSIZE);
  
  //3、为每个操作创建两组轨道栏:
  
  //3.1、第一个轨道栏“Element”返回erosion_elem或dilation_elem
  createTrackbar("卷积核类型",dilate_Win,&dilate_elem,max_elem,Dilation);
  //3.2、第二个轨道栏“内核大小”返回相应操作的erosion_size或dilation_size。
  createTrackbar("卷积核大小",dilate_Win,&dilate_size,max_kernel_size,Dilation);
  
  
  createTrackbar("卷积核类型",Erode_Win,&erode_elem,max_elem,Erosion);
  createTrackbar("卷积核大小",Erode_Win,&erode_size,max_kernel_size,Erosion);

  Dilation( 0, 0 );
  Erosion( 0, 0 );

  waitKey(0);
}

//膨胀
void Dilation(int,void*){
  int dilate_type;//内核选择三种形状中的任何一种
  if(dilate_elem == 0){ dilate_type = MORPH_RECT; }//矩形内核:MORPH_RECT
  else if(dilate_elem == 1){ dilate_type = MORPH_CROSS; }//十字架内核:MORPH_CROSS
  else if(dilate_elem == 2){ dilate_type = MORPH_ELLIPSE; }//椭圆内核:MORPH_ELLIPSE

  Mat kernel = getStructuringElement(dilate_type,Size(2*dilate_size+1,2*dilate_size+1),Point(dilate_size,dilate_size));
  dilate(src,dilate_dst,kernel);
  imshow( dilate_Win, dilate_dst );
}

//腐蚀
void Erosion(int,void*){
  int erosion_type;//内核选择三种形状中的任何一种
  if(erode_elem == 0){ erosion_type = MORPH_RECT; }//矩形内核:MORPH_RECT
  else if(erode_elem == 1){ erosion_type = MORPH_CROSS; }//十字架内核:MORPH_CROSS
  else if(erode_elem == 2){ erosion_type = MORPH_ELLIPSE; }//椭圆内核:MORPH_ELLIPSE

  Mat kernel = getStructuringElement(erosion_type,Size(2*erode_size+1,2*erode_size+1),Point(erode_size,erode_size));
  erode(src,erode_dst,kernel);
  imshow( Erode_Win, erode_dst );
}

运行结果

3. 形态学操作-开运算

  • 先腐蚀后膨胀
  • 可以去掉小的对象,假设对象是前景色,背景是黑色

4. 形态学操作-闭运算

  • 先膨胀后腐蚀
  • 可以填充小的洞,假设对象是前景色,背景是黑色

主要借鉴”Madcola“和”Micheal超“两位大神的文章。两位大神的博客主页是: https://www.cnblogs.com/skyfsm/(Madcola) https://blog.csdn.net/qq_42887760(Micheal超)

结束语

由于时间和文章篇幅有限,本次总结先到这里,下次小白会为小伙伴们带来OpenCV的形态学操作的应用,各位小伙伴敬请期待。如果小伙伴觉得本文对自己有帮助,请帮忙点击一下右下角的“在看”,鼓励一下小白。

往期文章一览

1、利用OpenCV实现图像修复(含源码)

2、20大热门项目告诉你,计算机视觉未来五大趋势

3、那些简历造假拿offer的程序员,后来都怎么样了?

4、我竟然用OpenCV实现了卡尔曼滤波

5、【走进OpenCV】滤波代码原来这么写

6、【走进OpenCV】这样腐蚀下来让我膨胀

7、小心!你看到的图像可能隐藏了重大机密

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 形态学操作-膨胀
  • 2. 形态学操作-腐蚀
  • 3. 形态学操作-开运算
  • 4. 形态学操作-闭运算
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档