OpenCV学习笔记(八):形态学morpholgy(2):开、闭运算,形态学梯度、顶帽、黑帽:morphologyEx()

数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。

一、开运算(Opening Operation)

其实就是先腐蚀后膨胀的过程:

开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

二、闭运算(Closing Operation)

先膨胀后腐蚀的过程:

闭运算能够排除小型黑洞(黑色区域),可以将团块的边缘突出出来。

三、形态学梯度(Morphological Gradient)

膨胀图与腐蚀图之差:

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。

四、顶帽(Top Hat)

顶帽运算(Top Hat)又常常被译为”礼帽“运算,源图与“开运算图“之差:

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,所以顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

五、黑帽(Black Hat)

为”闭运算“的结果图与原图像之差:

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,黑帽运算用来分离比邻近点暗一些的斑块。

六、morphologyEx函数详解:

C++: void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );

第一个参数,InputArray类型的src,输入图像,即源图像,(CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F)。
第二个参数,OutputArray类型的dst,即目标图像。
第三个参数,int类型的op,表示形态学运算的类型:

MORPH_OPEN – 开运算(Opening operation)
MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT -形态学梯度(Morphological gradient)
MORPH_TOPHAT - “顶帽”(“Top hat”)
MORPH_BLACKHAT - “黑帽”(“Black hat“)

第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

getStructuringElement函数相关的调用示例代码如下

//结构元素(内核矩阵)的尺寸
int g_nStructElementSize = 3;//获取自定义核
Mat element =getStructuringElement(MORPH_RECT,Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),Point(g_nStructElementSize, g_nStructElementSize ));

第一个参数表示内核的形状,我们可以选择如下三种形状之一

矩形: MORPH_RECT
交叉形: MORPH_CROSS
椭圆形: MORPH_ELLIPSE

第二和第三个参数分别是内核的尺寸以及锚点的位置,对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心

六、示例代码:

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat g_srcImage, g_dstImage;             //原始图和效果图
int g_nElementShape = MORPH_RECT;      //元素结构的形状//变量接收的TrackBar位置参数
int g_nMaxIterationNum = 10;       // 最大方向值
int g_nOpenCloseNum = 0;           // 开闭/运算内核值
int g_nTopBlackHatNum = 0;         // 顶帽/黑帽内核值int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 1、载入原图g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/综合.png");if( !g_srcImage.data ) { printf("Oh,no,读取srcImage错误~! \n"); return false; }// 2、显示原始图namedWindow("【原始图】");imshow("【原始图】", g_srcImage);// 3、创建窗口namedWindow("【开运算/闭运算】",1);namedWindow("【顶帽/黑帽】",1);// 4、参数赋值g_nOpenCloseNum=9;g_nTopBlackHatNum=10;// 5、分别为二个窗口创建滚动条createTrackbar("迭代值", "【开运算/闭运算】",&g_nOpenCloseNum,g_nMaxIterationNum*2+1,on_OpenClose);createTrackbar("迭代值", "【顶帽/黑帽】",&g_nTopBlackHatNum,g_nMaxIterationNum*2+1,on_TopBlackHat);// 6、轮询获取按键信息while(1){//执行回调函数on_OpenClose(g_nOpenCloseNum, 0);on_TopBlackHat(g_nTopBlackHatNum,0);//获取按键int c = waitKey(0);//按下键盘按键Q或者ESC,程序退出if( (char)c == 'q'||(char)c == 27 )break;//按下键盘按键1,使用椭圆(Elliptic)结构元素结构元素MORPH_ELLIPSEif( (char)c == 49 )//键盘按键1的ASII码为49g_nElementShape = MORPH_ELLIPSE;//按下键盘按键2,使用矩形(Rectangle)结构元素MORPH_RECTelse if( (char)c == 50 )//键盘按键2的ASII码为50g_nElementShape = MORPH_RECT;//按下键盘按键3,使用十字形(Cross-shaped)结构元素MORPH_CROSSelse if( (char)c == 51 )//键盘按键3的ASII码为51g_nElementShape = MORPH_CROSS;//按下键盘按键space,在矩形、椭圆、十字形结构元素中循环else if( (char)c == ' ' )g_nElementShape = (g_nElementShape + 1) % 3;}return a.exec();
}

1)开运算/闭运算 回调函数

static void on_OpenClose(int, void*)
{//偏移量的定义int offset = g_nOpenCloseNum - g_nMaxIterationNum;    //偏移量int Absolute_offset = offset > 0 ? offset : -offset;//偏移量绝对值//自定义核Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset*2+1, Absolute_offset*2+1), Point(Absolute_offset, Absolute_offset) );//进行操作if( offset < 0 )// 偏移量小于0 时,开运算morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);else if (offset == 0)g_srcImage.copyTo(g_dstImage);else// 偏移量大于0 时,闭运算morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);//显示图像imshow("【开运算/闭运算】",g_dstImage);
}

2)顶帽运算/黑帽运算 回调函数

static void on_TopBlackHat(int, void*)
{//偏移量的定义int offset = g_nTopBlackHatNum - g_nMaxIterationNum;//偏移量int Absolute_offset = offset > 0 ? offset : -offset;//偏移量绝对值//自定义核Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset*2+1, Absolute_offset*2+1), Point(-1, -1) );//进行操作if( offset < 0 )morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT , element);else if (offset == 0)g_srcImage.copyTo(g_dstImage);elsemorphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);//显示图像imshow("【顶帽/黑帽】",g_dstImage);
}

结果:
MORPH_ELLIPSE


MORPH_RECT


MORPH_CROSS

OpenCV学习笔记(八):形态学morpholgy(2):开/闭运算,形态学梯度、顶帽/黑帽morphologyEx()相关推荐

  1. python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀、开闭运算、礼帽与黑帽)

    一.腐蚀与膨胀 腐蚀就是原图中高亮的部分被蚕食,效果图拥有比原图更小的高亮区域. 腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点. 膨胀就是使原图中高亮的部分扩张,效果图拥有比 ...

  2. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  3. opencv学习笔记八--答题卡识别

    opencv学习笔记八--答题卡识别 导入工具包 定义函数 扫描 自适应阈值处理 检测每一个选项的轮廓 对轮廓进行排序以获取序号 打印结果 参考 导入工具包 #导入工具包 import numpy a ...

  4. pythonopencv图像形态_python+opencv图像形态学处理详细解释(膨胀、腐蚀、开闭运算、礼帽和黑猫)...

    python+opencv图像形态学处理 本篇博客主要是关于形态学中的腐蚀.膨胀.开运算.闭运算.礼帽和黑帽的函数用法. 内容会比较,为方便查阅.代码的解释会写在代码中. 用于测试的图像原图: 一.腐 ...

  5. Open_CV形态学运算专题 (腐蚀膨胀、开闭运算、梯度运算、顶帽运算黑帽运算 )【Python-Open_CV系列(十)】

      Open_CV形态学运算专题 之 腐蚀&膨胀.开&闭运算.梯度运算.顶帽运算黑帽运算               [Python-Open_CV系列(十)]   文章目录 1. 腐 ...

  6. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  7. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽

    图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...

  8. OPenCV学习笔记八-图像的滤波

    主要记录三种滤波函数的使用 VS2017 + Opencv3.2.0#include <opencv2/opencv.hpp> #include <iostream>using ...

  9. OpenCV学习笔记(八)--颜色空间及转换

    颜色空间 要用三种或更多的特征来指定一种颜色,有许多的方法被称为颜色空间或者颜色模型. 如何选取其中一种方法来表示一副图像要依赖于执行的运算. 不同的颜色空间的转换,Opencv提供方法 void c ...

最新文章

  1. 线上java JVM问题排查
  2. 贾扬清:我对人工智能方向的一点浅见
  3. NoSQL介绍、memcached介绍、安装memcached、 查看memcached状态
  4. 2.1Python基础语法(一)之注释与数据类型:
  5. c++ 分析core文件 在os x
  6. Cortex-M3-复位(序列)
  7. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...
  8. mysql binlog size_设置max_binlog_size和expire_logs_days参数,设置mysql数据库bin log清除机制...
  9. Zookeeper Tutorial 1 -- Overview
  10. Webstorm中文乱码的问题
  11. 国外免费数据集下载网址
  12. 计算机excel取整函数,Excel取整公式集锦
  13. 【Matlab水果识别】RGB+HSV水果成熟度分级系统【含GUI源码 825期】
  14. 总结使用Unity 3D优化游戏运行性能的经验
  15. Activiti6.0 多级审批流程 代码执行
  16. [ExtJS] 颜色选择器2.0
  17. 【v-on】一个元素绑定多个事件以及一个事件绑定多个函数的两种写法
  18. ios 反编译 破解
  19. AutoMapper 的使用
  20. GO 语言常用工具类-通用方法集合

热门文章

  1. vuedraggable示例_vuedraggable快速入门
  2. 【mysql】提取字符串中的数字、字母、中文,或任意组合
  3. bpsk调制及解调实验_无线通信中的IQ调制,BPSK调制,QPSK调制,16QAM调制的理解...
  4. 【KPGNN】运行错误与成功后的合集
  5. 可以闭眼入的O'REILLY机器学习神书出新版了!
  6. 论文浅尝 - ICLR2020 | You Can Teach an Old Dog New Tricks!关于训练知识图谱嵌入
  7. 论文浅尝 | 基于属性嵌入的知识图谱实体对齐
  8. python编程之如何判断某个元素在不在列表里面
  9. 神经网络算法学习---mini-batch++++mini-batch和batch的区别
  10. VS Code HtmlFindClass 插件介绍