OpenCV4.5.5学习笔记(十一):形态学操作(腐蚀、膨胀)与形态学滤波(开运算、闭运算、形态学梯度、顶帽(礼帽)与黑帽)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、形态学操作(腐蚀、膨胀)

形态学运算简而言之是一门基于形状处理图像的操作。形态学操作将结构元素应用于输入图像并生成输出图像。
最基本的形态学运算是:腐蚀和膨胀。它们具有广泛的用途,即:

  1. 去除噪音
  2. 分割单个元素并连接图像中的相邻元素。
  3. 查找图像中的极大值与极小值
  4. 求出图像的梯度

1.膨胀

膨胀就是求局部最大值的操作。从数学的角度来说,形态学操作就是将图像(或者是图像的一小块区域)与核进行卷积(核概念在上一篇笔记中介绍过)
膨胀既是计算核覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点的指定坐标。这样就会使图像中的高亮区域逐渐增大。
这是膨胀的公式:
在这里插入图片描述
膨胀使用的是dilate()函数
在OpenCV官方文档中是这么写的:
void cv::dilate (
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)
第一个参数是输入图像,
第二个参数是输出与 src 大小和类型相同的图像,
第三个参数是于膨胀的结构元素;如果 elemenat=Mat(),则使用 3 x 3 矩形结构元素,
第四个参数是锚点,默认值 Point(-1,-1) 表示锚点位于内核中心,
第五个参数是应用膨胀的次数,
第六个参数是像素外推法,
第七个参数是边界不变的情况下的边界值

2.腐蚀

腐蚀与膨胀是一对相反的操作
图像腐蚀使用的是erode函数,此处贴上官网上OpenCV4.5.5手册给出的说明:
void cv::erode (
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)

第一个参数是输入图像,
第二个参数是输出与 src 大小和类型相同的图像,
第三个参数是核,即用于腐蚀的结构元素
第四个参数是锚点,默认值 Point(-1,-1) 表示锚点位于内核中心,
第五个参数是应用腐蚀的次数,
第六个参数是像素外推法,
第七个参数是边界不变的情况下的边界值

原理简单来说是将目标图像中的像素值设为卷积核覆盖区域内的最小值。即:
在这里插入图片描述


二、形态学滤波(开运算、闭运算、形态学梯度、顶帽(礼帽)与黑帽)

1.开运算

实质上是先腐蚀后膨胀的过程,其表达式如下:
在这里插入图片描述
用于移除小物体(假设物体在黑暗的前景中是明亮的)
此处贴上官网上OpenCV4.5.5手册给出的例图:
在这里插入图片描述

2.闭运算

闭运算就是先膨胀后腐蚀的过程,其表达式如下:
在这里插入图片描述

扫描二维码关注公众号,回复: 14222501 查看本文章

用于去除小孔(暗区)。
此处贴上官网上OpenCV4.5.5手册给出的例图:
在这里插入图片描述

3.形态学梯度

形态学梯度是膨胀图与腐蚀图之差,其表达式如下:
在这里插入图片描述
它对于查找对象的轮廓很有用。
此处贴上官网上OpenCV4.5.5手册给出的例图:
在这里插入图片描述

4.顶帽(礼帽)

顶帽(又称礼帽)是原图像与开运算之差,其表达式如下:
在这里插入图片描述
顶帽会突出比原图轮廓周围的区域更明亮的区域,往往用来分离比邻近点亮一些的斑块,在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景的提取。
此处贴上官网上OpenCV4.5.5手册给出的例图:
在这里插入图片描述

5.黑帽

黑帽是闭运算与原图像之差,其表达式如下:
在这里插入图片描述
黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,常用来分离比临近点暗一些的斑块,效果图会有很好的轮廓。
此处贴上官网上OpenCV4.5.5手册给出的例图:
在这里插入图片描述


总结

这几篇主要是为了拿到CSDN的勤写标兵的徽章,所以写的比较赶,之后会细致一些写,而且我个人觉得这种文章挺水的且不能解决大家的实际问题,所以不会再写了。至少把OpenCV3这本书过完,正好全拿。

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124362411