• 如何使用OpenCV函数 morphologyEx 进行形态学操作:

    • 开运算 (Opening)
    • 闭运算 (Closing)
    • 形态梯度 (Morphological Gradient)
    • 顶帽 (Top Hat)
    • 黑帽(Black Hat)

原理

Note

以下内容来自于Bradski和Kaehler的大作 Learning OpenCV 。

前一节我们讨论了两种最基本的形态学操作:

  • 腐蚀 (Erosion)
  • 膨胀 (Dilation)

运用这两个基本操作,我们可以实现更高级的形态学变换。这篇文档将会简要介绍OpenCV提供的5种高级形态学操作:

开运算 (Opening)

  • 开运算是通过先对图像腐蚀再膨胀实现的。

  • 能够排除小团块物体(假设物体较背景明亮)

  • 请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。

闭运算(Closing)

  • 闭运算是通过先对图像膨胀再腐蚀实现的。

  • 能够排除小型黑洞(黑色区域)。

形态梯度(Morphological Gradient)

  • 膨胀图与腐蚀图之差

  • 能够保留物体的边缘轮廓,如下所示:

顶帽(Top Hat)

  • 原图像与开运算结果图之差

黑帽(Black Hat)

  • 闭运算结果图与原图像之差

源码

下面是本教程的源码, 你也可以从 这里 下载。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>using namespace cv;/// 全局变量
Mat src, dst;int morph_elem = 0;
int morph_size = 0;
int morph_operator = 0;
int const max_operator = 4;
int const max_elem = 2;
int const max_kernel_size = 21;char* window_name = "Morphology Transformations Demo";/** 回调函数申明 */
void Morphology_Operations( int, void* );/** @函数 main */
int main( int argc, char** argv )
{/// 装载图像src = imread( argv[1] );if( !src.data ){ return -1; }/// 创建显示窗口namedWindow( window_name, CV_WINDOW_AUTOSIZE );/// 创建选择具体操作的 trackbarcreateTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat", window_name, &morph_operator, max_operator, Morphology_Operations );/// 创建选择内核形状的 trackbarcreateTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,&morph_elem, max_elem,Morphology_Operations );/// 创建选择内核大小的 trackbarcreateTrackbar( "Kernel size:\n 2n +1", window_name,&morph_size, max_kernel_size,Morphology_Operations );/// 启动使用默认值Morphology_Operations( 0, 0 );waitKey(0);return 0;}/**
  * @函数 Morphology_Operations
  */
void Morphology_Operations( int, void* )
{// 由于 MORPH_X的取值范围是: 2,3,4,5 和 6int operation = morph_operator + 2;Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );/// 运行指定形态学操作morphologyEx( src, dst, operation, element );imshow( window_name, dst );}

解释

  1. 看一下程序的总体流程:

    • 装载图像

    • 创建显示形态学操作的窗口

    • 创建3个trackbar获取用户参数:

      • 第一个trackbar “Operator” 返回用户选择的形态学操作类型 (morph_operator).

        createTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat",window_name, &morph_operator, max_operator,Morphology_Operations );
        

      • 第二个trackbar “Element” 返回 morph_elem, 指定内核形状:

        createTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,&morph_elem, max_elem,Morphology_Operations );
        

      • 第三个trackbar “Kernel Size” 返回内核大小(morph_size)

        createTrackbar( "Kernel size:\n 2n +1", window_name,&morph_size, max_kernel_size,Morphology_Operations );
        

    • 每当任一标尺被移动, 用户函数 Morphology_Operations 就会被调用,该函数获取trackbar的当前值运行指定操作并更新显示结果图像。

       /**
        * @函数 Morphology_Operations
        */
      void Morphology_Operations( int, void* )
      {// 由于 MORPH_X的取值范围是: 2,3,4,5 和 6int operation = morph_operator + 2;Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );/// 运行指定形态学操作morphologyEx( src, dst, operation, element );imshow( window_name, dst );}
      

      运行形态学操作的核心函数是 morphologyEx 。在本例中,我们使用了4个参数(其余使用默认值):

      • src : 原 (输入) 图像
      • dst: 输出图像
      • operation: 需要运行的形态学操作。 我们有5个选项:
        • Opening: MORPH_OPEN : 2
        • Closing: MORPH_CLOSE: 3
        • Gradient: MORPH_GRADIENT: 4
        • Top Hat: MORPH_TOPHAT: 5
        • Black Hat: MORPH_BLACKHAT: 6

      你可以看到, 它们的取值范围是 <2-6>, 因此我们要将从tracker获取的值增加(+2):

      int operation = morph_operator + 2;
      

      • element: 内核,可以使用函数:get_structuring_element:getStructuringElement <> 自定义。

结果

  • 在编译上面的代码之后, 我们可以运行结果,将图片路径输入。这里使用图像: baboon.png:

  • 这里是显示窗口的两个截图。第一幅图显示了使用交错内核和 开运算 之后的结果, 第二幅图显示了使用椭圆内核和 黑帽 之后的结果。

opencv 其他形态学变换相关推荐

  1. Python+OpenCV:形态学变换

    Python+OpenCV:形态学变换 理论 形态学变换是基于图像形状的一些简单操作. 它通常在二值图像上执行.它需要两个输入,一个是我们的原始图像,另一个是结构元素(structuring elem ...

  2. OpenCV之imgproc 模块. 图像处理(1)图像平滑处理 腐蚀与膨胀(Eroding and Dilating) 更多形态学变换 图像金字塔 基本的阈值操作

    图像平滑处理 目标 本教程教您怎样使用各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: blur GaussianBlur medianBlur bilateralFilter 原理 No ...

  3. OpenCV (iOS)中的形态学变换(11)

    形态学的高级形态往往是建立在腐蚀和膨胀这两个基本操作之上,关于腐蚀和膨胀请参考OpenCV中的腐蚀和膨胀(9) 使用OpenCV中函数morphologyEx进行形态学操作 (1)开运算 (Openi ...

  4. opencv 膨胀_【3】OpenCV图像处理模块(5)更多的形态学变换(开、闭、形态梯度、顶帽、黑帽)...

    形态学变换有多种类型,上一节展示了最基本的腐蚀和膨胀.本节使用OpenCV提供的 cv::morphologyEx()函数实现多种形态学变换,如开运算.闭运算.形态学梯度.顶帽变换.黑帽变换等. 理论 ...

  5. opencv 形态学变换 morphologyEx函数

    opencv 形态学变换 morphologyEx函数 demo:http://download.csdn.net/detail/keen_zuxwang/9852594 高级形态学变换: 开运算: ...

  6. 使用Python,OpenCV进行形态学操作

    使用Python,OpenCV进行形态学操作) 1. 效果图 2. 原理 3. 源码 3.1 [制作logo源码](https://blog.csdn.net/qq_40985985/article/ ...

  7. 膨胀和腐蚀之外的其他形态学变换

    目的: 基于OpenCV 函数 cv::morphologyEx 实现如下形态学变换: Opening(开运算) Closing(闭运算) Morphological Gradient(形态学梯度) ...

  8. OpenCV学习——形态学

    前言 继续学习图像里面的形态学知识--结构元.腐蚀.膨胀.开运算.闭运算.击中/不击中变换.以及部分基本形态学算法,包括边界提取.空洞填充.连通分量的提取.凸壳.细化.粗化.骨架.裁剪.形态学重建. ...

  9. opencv —— morphology形态学操作函数讲解(python)

    opencv -- morphology形态学操作函数讲解 目录 opencv -- morphology形态学操作函数讲解 形态学滤波:morphologyEx 函数 开运算:先腐蚀后膨胀. 闭运算 ...

最新文章

  1. swift 多线程GCD和延时调用
  2. C++ 类构造函数初始化列表介绍
  3. linux shell 读取文件指定单行 多行 连续行 倒数几行
  4. Android targetSdkVersion 原理
  5. SVN提示:由于目标机器积极拒绝,无法连接 的解决方法
  6. spoon无法初始化至少一个步骤_手机怎么设置无线路由器 手机设置无线路由器步骤【详解】...
  7. anroid抓包工具tcpdump的用法
  8. vue设置多选框默认勾选_vue中复选框怎么默认全选,至少选择4个才可以点击下一步...
  9. mysql ddl 进度_MySQL5.7 慢查询+DDL操作堵塞查询
  10. 深度学习2.0-18.随机梯度下降之手写数字问题实战(层)
  11. Coursera机器学习课后作业Matlab代码(1~9周)
  12. 原型模式(Prototype)C++实现
  13. (转)Android调试运行时错误之Process XXX terminated by signal (11)
  14. (pythonQQ群管理)通过selenium 自动批量删除QQ群成员
  15. PPT 宏 macro图片crop
  16. Failed to compile../public/UEditor/dialogs/template/template.html 1:0Module parse failed: Unexpec
  17. 品牌设计与VI设计的不同之处
  18. 一个公布每天全球被黑网站的站点
  19. 《我喜欢生命本来的样子》读后感作文2100字
  20. python验证角谷_角谷猜想-随心随性无为而为-51CTO博客

热门文章

  1. android的helloworld工程目录学习
  2. WINCE下实现基于USB的camera
  3. Swift实现CoreData存储数据
  4. MEDC2007北京游记 - WindowsMobile Ophone
  5. DokuWiki 开源wiki引擎程序
  6. 常见的IE浏览器的一些兼容问题及解决方法
  7. 什么是关键字驱动框架(自动化测试)
  8. 【Android开发】构建Android源码编译环境
  9. 桥牌笔记:3NT做庄路线
  10. postfix+postfixadmin+extmail邮件服务器架设过程