OpenCV学习笔记(七):形态学(morpholgy):腐蚀/膨胀:enrode(),dilate()

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

简单来讲,形态学操作就是基于形状的一系列图像处理操作。膨胀与腐蚀能实现多种多样的功能,主要如下:
1.消除噪声
2.分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
3.寻找图像中的明显的极大值区域或极小值区域
4.求出图像的梯度

一、膨胀就是求局部最大值的操作
按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。
核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点(anchorpoint)。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。
而膨胀就是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。

二、腐蚀就是求局部最小值的操作。
膨胀和腐蚀是一对好基友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。

代码:

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat g_srcImage, g_dstImage;                 //原始图和效果图
int g_nTrackbarNumer = 1;                  //0表示腐蚀erode, 1表示膨胀dilate
int g_nStructElementSize = 7;              //结构元素(内核矩阵)的尺寸int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 1、载入原图if(g_nTrackbarNumer==0)g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/erode.jpg");elseg_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/dilate.png");if( !g_srcImage.data ) { printf("读取srcImage错误~! \n"); return false; }// 2、显示原始图namedWindow("【原始图】");imshow("【原始图】", g_srcImage);// 3、进行初次腐蚀操作并显示效果图(初始化显示)namedWindow("【效果图】");Process();// 4、创建轨迹条createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumer, 1, on_TrackbarNumChange);       // 切换开关createTrackbar("内核尺寸", "【效果图】", &g_nStructElementSize, 21, on_ElementSizeChange);       // 内核大小改变// 5、输出一些帮助信息cout<<endl<<"\t运行成功,请调整滚动条观察图像效果~\n\n"<<"\t按下“q”键时,程序退出。\n";//轮询获取按键信息,若下q键,程序退出while(char(waitKey(1)) != 'q') {}return a.exec();
}

1)自定义的腐蚀或膨胀处理函数

void Process()
{// 1、获取自定义核Mat element = getStructuringElement(MORPH_ELLIPSE, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point(-1,-1));// 2、进行腐蚀或膨胀操作if(g_nTrackbarNumer == 0){erode(g_srcImage, g_dstImage, element);}else{dilate(g_srcImage, g_dstImage, element);}// 3、显示效果图imshow("【效果图】", g_dstImage);
}

2)切换开关 回调函数

void on_TrackbarNumChange(int, void *)
{//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来Process();
}

3)内核调整 回调函数

void on_ElementSizeChange(int, void *)
{//内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来Process();
}

结果:
erode

dilate

OpenCV学习笔记(七):形态学morpholgy(1):腐蚀/膨胀:enrode(),dilate()相关推荐

  1. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  2. Opencv学习笔记七(梯度算子、锐化)

    Sobel算子 卷积的作用除了实现图像模糊或者去噪,还可以寻找一张图像上所有梯度信息,这些梯度信息是图像的最原始特征数据,进一步处理之后就可以生成一些比较高级.抽象的特征用来表示一张图像实现基于图像特 ...

  3. OpenCV学习笔记七-创建滑动条

    摘要:主要记录滑动条函数使用方法 创建滑动条函数: C++: int createTrackbar(const string& trackbarname, const string& ...

  4. 【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】

    一:膨胀和腐蚀 原始图像如下: hw.png hw_inv.png 如下展示代码: import numpy as np import random import cv2 import matplot ...

  5. opencv计算图像亮度调节_【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整...

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  6. opencv学习笔记七:绘图和注释

    艺术线条和填充多边形 画直线或者其他图形(虚线,圆,矩形等)的函数都接受宽度(thickenss)和线性(lineType)的参数,这两个都是整型的,但第二个参数的值只能是4,8或者cv::LINE_ ...

  7. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

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

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

  9. OpenCV学习笔记与代码示例(三):张氏标定法标定相机原理及函数详解

    目录 1.张氏标定法基本原理 1.1相机针孔模型 1.2单应矩阵H 1.3求相机内参 1.4求相机外参 1.5优化参数 1.6总结 2.OpenCV实现 2.1特征点检测与靶标坐标初始化 2.2相机标 ...

最新文章

  1. vue 表单验证按钮事件交由父组件触发
  2. 推进大数据中心新能源应用 广东省六部门联合印发培育新能源战略性新兴产业集群行动计划(2021—2025年)...
  3. EasyUI的combobox用法
  4. 【Redis】Linux下Redis安装与redis-desktop-manager使用(无法连接Redis服务器解决方法)...
  5. Shell脚本之sed的使用
  6. c#语言基础编程-转义符
  7. 前端学习(2479):接口文档使用
  8. Java Enum学习总结
  9. SPH算法(求最小代价树)
  10. keras笔记-模型保存以及tensorboard的使用
  11. Jenkins使用教程
  12. LTE的基础知识与关键技术
  13. 薅当当羊毛的机会又!双!!叒!!!叕!!!来了
  14. java代码实现流程中的会签_Activiti实现会签功能
  15. 排位赛中 服务器崩溃修复后连不上,lol手游出现creating a lobby问题怎么办?服务器崩溃解决方法说明[多图]...
  16. php打包签名apk文件在哪,Android_android应用签名详细步骤,1、准备工作apk的签名工作可以 - phpStudy...
  17. Nginx的启动、停止与重启
  18. 对于tcp的一点点解读,不止是三次握手、四次挥手
  19. 华师计算机设计大赛,广东省首届高校大学生计算机设计大赛在华师举行
  20. matplotlib基础(4)之饼图 pie

热门文章

  1. oracle scn隐藏参数,Oracle隐含参数scn不一致启动
  2. 数据挖掘学习指南!!
  3. 论文浅尝 | Multimodal Few-Shot Learning with Frozen Language Models
  4. 论文学习11-Adversarial training for multi-context joint entity and relation extraction(实体关系买抽取模型,对抗学习
  5. 雷林鹏分享:C# 多态性
  6. Gym - 100989J -(DFS)
  7. Restful Service 中 DateTime 在 url 中传递
  8. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
  9. 个人对响应式布局的理解
  10. android user版本默认开启调试模式