说明

开运算:先腐蚀后膨胀的过程,可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
闭运算:先膨胀后腐蚀的过程,能够排除小型黑洞(黑色区域)。
形态学梯度:膨胀图与腐蚀图之差,对二值图像进行这一操作可以将团块(blob)的边缘突出出来。可以用形态学梯度来保留物体的边缘轮廓。
顶帽:为原图像开运算的结果图之差,放大了裂缝或者局部低亮度的区域,突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
黑帽:为闭运算的结果图与原图像之差。黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。所以,黑帽运算用来分离比邻近点暗一些的斑块

离散傅里叶变换
图像高频部分代表了图像的细节、纹理信息;低频代表了图像的轮廓信息。
低通-》模糊
高通-》锐化
腐蚀和膨胀是针对白色部分(高亮部分)而言的。膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。
开运算:先腐蚀再膨胀,用来消除小物体
闭运算:先膨胀再腐蚀,用于排除小型黑洞
形态学梯度:就是膨胀图与俯视图之差,用于保留物体的边缘轮廓。
顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。
黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。

示例

//-----------------------------------【头文件包含部分】---------------------------------------
//      描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>//-----------------------------------【命名空间声明部分】--------------------------------------
//      描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;//-----------------------------------【全局变量声明部分】--------------------------------------
//      描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage;//原始图和效果图
int g_nElementShape = MORPH_RECT;//元素结构的形状//变量接收的TrackBar位置参数
int g_nMaxIterationNum = 10;
int g_nOpenCloseNum = 0;
int g_nErodeDilateNum = 0;
int g_nTopBlackHatNum = 0;//-----------------------------------【全局函数声明部分】--------------------------------------
//      描述:全局函数声明
//-----------------------------------------------------------------------------------------------
static void on_OpenClose(int, void*);//回调函数
static void on_ErodeDilate(int, void*);//回调函数
static void on_TopBlackHat(int, void*);//回调函数
static void ShowHelpText();//帮助文字显示//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{//改变console字体颜色system("color 2F");ShowHelpText();//载入原图g_srcImage = imread("1.jpg");//工程目录下需要有一张名为1.jpg的素材图if (!g_srcImage.data) { printf("Oh,no,读取srcImage错误~! \n"); return false; }//显示原始图namedWindow("【原始图】");imshow("【原始图】", g_srcImage);//创建三个窗口namedWindow("【开运算/闭运算】", 1);namedWindow("【腐蚀/膨胀】", 1);namedWindow("【顶帽/黑帽】", 1);//参数赋值g_nOpenCloseNum = 9;g_nErodeDilateNum = 9;g_nTopBlackHatNum = 2;//分别为三个窗口创建滚动条createTrackbar("迭代值", "【开运算/闭运算】", &g_nOpenCloseNum, g_nMaxIterationNum * 2 + 1, on_OpenClose);createTrackbar("迭代值", "【腐蚀/膨胀】", &g_nErodeDilateNum, g_nMaxIterationNum * 2 + 1, on_ErodeDilate);createTrackbar("迭代值", "【顶帽/黑帽】", &g_nTopBlackHatNum, g_nMaxIterationNum * 2 + 1, on_TopBlackHat);//轮询获取按键信息while (1){int c;//执行回调函数on_OpenClose(g_nOpenCloseNum, 0);on_ErodeDilate(g_nErodeDilateNum, 0);on_TopBlackHat(g_nTopBlackHatNum, 0);//获取按键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 0;
}//-----------------------------------【on_OpenClose( )函数】----------------------------------
//      描述:【开运算/闭运算】窗口的回调函数
//-----------------------------------------------------------------------------------------------
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)morphologyEx(g_srcImage, g_dstImage, CV_MOP_OPEN, element);elsemorphologyEx(g_srcImage, g_dstImage, CV_MOP_CLOSE, element);//显示图像imshow("【开运算/闭运算】", g_dstImage);
}//-----------------------------------【on_ErodeDilate( )函数】----------------------------------
//      描述:【腐蚀/膨胀】窗口的回调函数
//-----------------------------------------------------------------------------------------------
static void on_ErodeDilate(int, void*)
{//偏移量的定义int offset = g_nErodeDilateNum - 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)erode(g_srcImage, g_dstImage, element);elsedilate(g_srcImage, g_dstImage, element);//显示图像imshow("【腐蚀/膨胀】", g_dstImage);
}//-----------------------------------【on_TopBlackHat( )函数】--------------------------------
//      描述:【顶帽运算/黑帽运算】窗口的回调函数
//----------------------------------------------------------------------------------------------
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(Absolute_offset, Absolute_offset));//进行操作if (offset < 0)morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element);elsemorphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);//显示图像imshow("【顶帽/黑帽】", g_dstImage);
}//-----------------------------------【ShowHelpText( )函数】----------------------------------
//      描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText()
{//输出一些帮助信息printf("\n\n\n\t请调整滚动条观察图像效果~\n\n");printf("\n\n\t按键操作说明: \n\n""\t\t键盘按键【ESC】或者【Q】- 退出程序\n""\t\t键盘按键【1】- 使用椭圆(Elliptic)结构元素\n""\t\t键盘按键【2】- 使用矩形(Rectangle )结构元素\n""\t\t键盘按键【3】- 使用十字型(Cross-shaped)结构元素\n""\t\t键盘按键【空格SPACE】- 在矩形、椭圆、十字形结构元素中循环\n");
}

结果

morphologyEx

形态学图像处理:开运算、闭运算、形态学梯度、顶帽、黑帽合辑相关推荐

  1. 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

  2. C++ OpenCV形态学操作--开闭操作,形态学梯度,顶帽,黑帽

    https://my.oschina.net/u/4582134/blog/4582844

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

    OpenCV学习笔记(八):形态学morpholgy(2):开.闭运算,形态学梯度.顶帽.黑帽:morphologyEx() 数学形态学(Mathematical morphology) 是一门建立在 ...

  4. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  5. C# EMGU 3.4.1学习笔记(三)综合示例:形态学滤波(腐蚀/膨胀、开运算/闭运算、顶帽运算/黑帽运算)

    以下是<OpenCV3编程入门>中6.4.9的示例程序的C# + EMGU 3.4.1版: 有任何问题或疑问,欢迎交流探讨. using System; using System.Coll ...

  6. 图像算法七:【形态学图像处理】二值运算、膨胀、腐蚀

    二值图像腐蚀函数 [算法说明]:二值图像腐蚀操作属于图像形态学的范畴,形态学运算是只针对二值图像进行,并依据数学形态学(Mathermatical Morphogy)集合论方法发展起来的数字图像处理方 ...

  7. opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽

    Morphological Transformations 1图像腐蚀 腐蚀的基本思想:侵蚀前景物体的边界(总是试图保持前景为白色):内核在图像中滑动(如在2D卷积中).只有当内核下的所有像素都是1时 ...

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

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

  9. 膨胀 腐蚀 开运算 闭运算 matlab,11. 形态学膨胀、腐蚀、开运算、闭运算

    1. 膨胀:对边界点进行扩充,填充空洞,使边界向外部扩张的过程. 2. 腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉. 3. 开运算: 先腐蚀后膨胀的过程称为开运算,作用: ...

最新文章

  1. opencv-python处理图片的一些列操作之几何变换
  2. [转]HTTP请求模型和头信息
  3. html表单自动提交表单提交表单数据类型,表单
  4. 为什么操作dom会消耗性能
  5. HTML网页使用CDN的jquery.qrcode.min.js生成页面二维码(直接可以复制使用)
  6. node.js 针对不同的请求路径(url) 做出不同的响应
  7. 我是程序员,我比较喜欢有纪律的团队。
  8. paip.cache 缓存架构以及性能提升总结
  9. 图像匹配之不变矩匹配法
  10. 基于matlab雷达算法,基于MATLAB的雷达信号处理
  11. 齿轮的正负变位设计要点
  12. 文本挖掘学习笔记(二):文档信息向量化与主题关键词提取
  13. matlab解薛定谔方程,定态薛定谔方程的MATLAB求解(一)
  14. Liu C-2021-1: Nontrivial Gates FET
  15. 细胞衰老——酪氨酸激酶抑制剂
  16. 【AGC035F】Two Histograms
  17. 伊滨区应急管理局领导莅临埃思特考察指导
  18. ESP32-NVS存储(非易失性存储库)
  19. 臭鱼的产品交互设计分享
  20. 当代偷车贼分两种,剪电线的和用智能设备的

热门文章

  1. CorelDraw X4 unable to load resource dll
  2. 【转】如何成为一个牛逼的程序员
  3. mysql 移除权限_MySQL用户授权及删除权限
  4. 查询最近电脑都访问过哪些文件
  5. JasperSoft相关报错合集,持续更新
  6. sklearn.svm.SVC中raise ValueError(“Unknown label type: %r” % y_type)ValueError: Unknown label type:处理
  7. springboot旅游景区景点购票小程序毕业设计毕设作品开题报告开题答辩PPT
  8. VS2019 MFC CreateFontW 创建字体函数详细解读
  9. 手绘风 PPT:Google 是如何运作的?-20141116早读课
  10. C语言测量程序运行时间