《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀
第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):腐蚀与膨胀相关推荐
- 原创 OpenCV3编程入门 学习笔记(总)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...
- OpenCV3编程入门 学习笔记(总)
OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...
- Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)
若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV
邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...
- Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题
这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...
- 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步
文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...
- Opencv3编程入门学习笔记(二)之显式创建Mat对象
以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...
- opencv 核 腐蚀_OpenCV学习笔记(五)形态学操作:腐蚀、膨胀
一.形态学概述 我们图像处理中指的形态学,往往表示的是数学形态学.下面一起来了解数学形态学的概念. 下面是来自百度百科对数学形态学的解释: 数学形态学是由一组形态学的代数运算子组成的,它的基本运算有4 ...
- 01.Java 编程入门学习笔记20210307
Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...
最新文章
- Location对象、History对象
- 全站仪数据导入电脑_三鼎762R系列全站仪的SD卡传输教程
- 详解 Flink 容器化环境下的 OOM Killed
- 深入理解Spring Redis的使用 (一)、Spring Redis基本使用
- UML模型中的图-实现图【组件图、配置图】
- Jenkins cannot restart itself as currently configured
- ssl1127-方程的解数【HASH,dfs】
- Excel日期格式在matlab中的转换
- Hadoop学习笔记(一)从官网下载安装包
- MPC实现自动驾驶轨迹跟踪
- python date,datetime 和time的区别
- [MySQL Bug]DDL操作导致备库复制中断
- bzoj 1113: [Poi2008]海报PLA(栈)
- matlab2c使用c++实现matlab函数系列教程-unifstat函数
- python类中包含一个特殊的变量、它表示当前对象自身_知到APP教师职场礼仪第七单元章节测试网课答案大学课后答案...
- Linux部署安装JDK和Tomcat
- oracle防止绿盟扫描,Oracle认证:Oracle避免全表扫描方式
- Python实现对网易云音乐的数据进行一个数据清洗和可视化分析
- TN3399开发板折腾记录
- 计算机一级IF函数应用,计算机一级if函数怎么用