第6章 图像处理

6.3 形态学滤波(1):腐蚀与膨胀

6.3.1 形态学概述

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

6.3.2 膨胀

1.求局部最大值的操作,数学角度:将图像与核进行卷积,即计算核覆盖区域的像素点最大值,并把最大值赋值给参考点指定像素,这样就会使图像中高亮区域逐渐增长。
2.核:带有一个参考点(锚点,anchor point),任意形状大小的区域。
3.膨胀数学表达式
          
          
4.封装函数:dilate函数
5.函数原型

void dilate(InputArray src,OutputArray dst,InputArray kernel,Point anchor=Point(-1,-1),int iteration=1,int borderType=BORDER_CONSTANT,const Scaler& borderValue=morphologyDefaultBorderValue());

6.参数说明
(1)输入图像
(2)目标图像
(3)膨胀操作的核,为NULL时表示使用参考点位于中心3*3的核,常使用getStructuringElement返回指定形状和大小的结构元素
    1)形状:矩型:MORPH_RECT,交叉型:MORPH_CROSS,椭圆形:MORPH_ELLIPSE
    2)内核尺寸
    3)锚点位置
    4)调用示例:

Int g_nStructElementSize = 3;
Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructuringElement+1, 2*g_nStructElementSize+1), Point(g_nStructElementSize,g_nStructElementSize ));

(4)锚的位置,默认(-1,-1)表示位于中心
(5)迭代使用dilate()函数的次数,默认1
(6)用于推断图像外部像素的某种边界模式,默认值BORDER_DFALUT
(7)当边界为常数时的边界值,默认值morphologyDefalutBorderValue()

6.3.3 腐蚀

1.求局部最小值的操作,将图像与核进行卷积,即计算核覆盖区域的像素点最小值,并赋值给参考点指定的像素,这样就会使图像中高亮区域逐渐增长。
2.腐蚀的数学表达式
          
          

3.封装函数:erode()函数
4.函数原型

void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& broderValue=morphologyDefalutBorderValue());

5.参数说明
(1)输入图像
(2)目标图像
(3)腐蚀操作的核,为NULL时表示使用参考点位于中心3*3的核,常使用getStructuringElement返回指定形状和大小的结构元素
(4)锚的位置,默认(-1,-1)表示位于中心
(5)迭代使用erode()函数的次数,默认1
(6)用于推断图像外部像素的某种边界模式,默认值BORDER_DFALUT
(7)当边界为常数时的边界值,默认值morphologyDefalutBorderValue()

6.3.4 综合示例:腐蚀与膨胀

//滑动条1用于腐蚀与膨胀之间切换
//滑动条2用于调节内核尺寸
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;//全局变量
Mat g_srcImage, g_dstImage;
int g_nTrackbarNumber = 0;//0表示腐蚀erode,1表示膨胀dilate
int g_nStructElementSize = 3;//结构元素(内核矩阵)的尺寸//全局函数
void Process(); //膨胀和腐蚀的处理函数
void on_TrackbarNumChange(int, void*);//腐蚀和膨胀操作之间切换开关的回调函数
void on_ElementSizeChange(int, void*);//腐蚀和膨胀操作内核改变时的回调函数int main()
{//改变console颜色system("color 5E");//载入原图g_srcImage = imread("love.jpg");if (!g_srcImage.data){printf("载入源图像错误~!\n");return false;}//显示原图namedWindow("【原始图】");imshow("【原始图】", g_srcImage);//创建效果图窗口namedWindow("【效果图】");//创建轨迹条createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumber, 1, on_TrackbarNumChange);createTrackbar("内核尺寸", "【效果图】", &g_nStructElementSize, 21, on_ElementSizeChange);on_TrackbarNumChange(g_nTrackbarNumber, 0);waitKey(0);return 0;
}
//进行自定义的腐蚀和膨胀操作
void Process()
{//获取自定义核Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1), Point(g_nStructElementSize, g_nStructElementSize));//进行腐蚀或膨胀操作if (g_nTrackbarNumber == 0){erode(g_srcImage, g_dstImage, element);}else{dilate(g_srcImage, g_dstImage, element);}//显示效果图imshow("【效果图】", g_dstImage);
}
//腐蚀和膨胀操作之间切换开关的回调函数
void on_TrackbarNumChange(int, void*)
{//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来Process();
}
//腐蚀和膨胀操作内核改变时的回调函数
void on_ElementSizeChange(int, void*)
{//内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来Process();
}

运行效果:


《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀相关推荐

  1. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  2. OpenCV3编程入门 学习笔记(总)

    OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...

  3. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)

    若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...

  4. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  5. 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

    邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...

  6. Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题

    这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...

  7. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  8. Opencv3编程入门学习笔记(二)之显式创建Mat对象

    以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...

  9. opencv 核 腐蚀_OpenCV学习笔记(五)形态学操作:腐蚀、膨胀

    一.形态学概述 我们图像处理中指的形态学,往往表示的是数学形态学.下面一起来了解数学形态学的概念. 下面是来自百度百科对数学形态学的解释: 数学形态学是由一组形态学的代数运算子组成的,它的基本运算有4 ...

  10. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

最新文章

  1. Location对象、History对象
  2. 全站仪数据导入电脑_三鼎762R系列全站仪的SD卡传输教程
  3. 详解 Flink 容器化环境下的 OOM Killed
  4. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用
  5. UML模型中的图-实现图【组件图、配置图】
  6. Jenkins cannot restart itself as currently configured
  7. ssl1127-方程的解数【HASH,dfs】
  8. Excel日期格式在matlab中的转换
  9. Hadoop学习笔记(一)从官网下载安装包
  10. MPC实现自动驾驶轨迹跟踪
  11. python date,datetime 和time的区别
  12. [MySQL Bug]DDL操作导致备库复制中断
  13. bzoj 1113: [Poi2008]海报PLA(栈)
  14. matlab2c使用c++实现matlab函数系列教程-unifstat函数
  15. python类中包含一个特殊的变量、它表示当前对象自身_知到APP教师职场礼仪第七单元章节测试网课答案大学课后答案...
  16. Linux部署安装JDK和Tomcat
  17. oracle防止绿盟扫描,Oracle认证:Oracle避免全表扫描方式
  18. Python实现对网易云音乐的数据进行一个数据清洗和可视化分析
  19. TN3399开发板折腾记录
  20. 计算机一级IF函数应用,计算机一级if函数怎么用

热门文章

  1. Java垃圾回收之老年代垃圾收集器
  2. 手把手教你搭建 Git 服务器
  3. 神经网络为什么需要多次epoch
  4. 【转载】 Python动态生成变量
  5. 奇异值分解 SVD 的数学解释
  6. RabbitMQ超详细安装教程(Linux)
  7. Linux 交叉编译简介
  8. 开源软硬一体OpenCV AI Kit(OAK)
  9. Mask R-CNN用于目标检测和分割代码实现
  10. 2021年大数据Kafka(八):Kafka如何保证数据不丢失