图像形态学操作之顶帽操作(TopHat)与黑帽操作(BlackHat)
Posted 昊虹图像算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像形态学操作之顶帽操作(TopHat)与黑帽操作(BlackHat)相关的知识,希望对你有一定的参考价值。
大家看这篇博文前可以先看一看下面这两篇博文,下面这两篇博文是这篇博文的基础:
1、详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
2、图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作
图像形态学腐蚀可以将细小的噪声区域去除,但是会将图像主要区域的面积缩小,造成主要区域的形状发生改变;图像形态学膨胀可以扩充每一个区域的面积,填充较小的空洞,但是会增加噪声的面积。
根据两者的特性将图像腐蚀和膨胀适当的结合,便可以既去除图像中的噪声,又不缩小图像中主要区域的面积;既填充了较小的空洞,又不增加噪声所占的面积。
将图像的腐蚀和膨胀结合产了以下这些运算:
图像的开运算、图像的闭运算、图像的形态学梯度运算、图像的顶帽运算、图像的黑帽运算、图像的击中击不中变换。
本篇博文介绍图像的形态学操作之顶帽操作与黑帽操作。
先说顶帽操作。
顶帽操作是源图像与图像开运算结果之间的差,它把开运算“去掉”的细节显现出来。
我们回顾下开运算的作用:
- 消除值高于邻近点的孤立点,达到去除图像中噪声的作用;
- 消除较小的连通域,保留较大的连通域;
- 断开较窄的狭颈,可以在两个物体纤细的连接处将它们分离;
- 不明显改变较大连通域的面积的情况下平滑连通域的连界、轮廓;
那么顶帽运算的作用便是:
- 把值高于邻近点的孤立点或斑块分离出来。
- 把较小的连通域分离出来。
- 把较窄的狭颈和两个物体的纤细连接处分离出来。
再说黑帽操作。
黑帽操作是闭运算结果与原图像之间的差值,它把闭运算“增加”的细节显现出来。
我们回顾下闭运算的作用:
- 消除值低于邻近点的孤立点,达到去除图像中噪声的作用;
- 连接两个邻近的连通域;
- 弥合较窄的间断和细长的沟壑;
- 去除连通域内的小型空洞;
- 和开运算一样也能够平滑物体的轮廓;
那么黑帽运算的作用便是:
- 把值低于邻近点的孤立点或斑块分离出来。
- 把较窄的间断和细长的沟壑显现出来;
- 把连通域内的小型空洞显现出来;
在OpenCV中,我们可以用函数morphologyEx()实现对图像的开闭运算,其函数原型如下:
void cv::morphologyEx ( InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)
参数意义与博文(链接 https://blog.csdn.net/wenhao_ir/article/details/124763833)中的腐蚀和膨胀操作函数erode()、dilate()一样。只是多一个 op 参数,它的值用于确定作何种图像形态学运算,其可取值及意义如下图所示:
从上图可以看出,它可以取MORPH_OPEN、MORPH_CLOSE 、MORPH_GRADIENT、MORPH_TOPHAT 、MORPH_BLACKHAT这五个值,分别对应于图像形态学的开操作、闭操作、梯度运算、顶帽运算和黑帽运算。
本篇博文中我们用值MORPH_TOPHAT和MORPH_BLACKHAT实现图像的顶帽操作和黑帽操作。
示例代码如下:
代码中用到的图像下载链接:https://pan.baidu.com/s/12ttJ8tQ1s-jBsZwhl4-97A?pwd=x5km
//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601
//OpenCV版本:3.0
//VS版本:2013
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
//载入原图
Mat image = imread("F:/material/images/P0049-Top-Hat-02.jpg", 0);
//显示原图
imshow("顶帽-黑帽运算原图", image);
//获取结构
cv::Mat element1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(7, 7));
Mat out1,out2;
//进行形态学顶帽运算操作
morphologyEx(image, out1, MORPH_TOPHAT, element1);
//进行形态学黑帽运算操作
morphologyEx(image, out2, MORPH_BLACKHAT, element1);
//显示效果图
imshow("顶帽运算效果图", out1);
imshow("黑帽运算效果图", out2);
waitKey(0);
return 0;
运行结果如下图所示:
从以上的运行结果我们可以很明显看出,顶帽运算把值高于邻近点的孤立点分离了出来,黑帽运算把值低于邻近点的孤立点分离了出来。当然二者的作用不止这一点,具体的作用见本文上面的叙述吧。
扩展阅读:
详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作
图像的形态学梯度运算(基本梯度、外部梯度、内部梯度、X方向梯度、Y方向梯度)的概念、作用以及相关的OpenCV示例代码
详解图像形态学中的击中击不中变换操作(HMT),并提醒大家OpenCV4中的击中击不中变换操作是有问题的
以上是关于图像形态学操作之顶帽操作(TopHat)与黑帽操作(BlackHat)的主要内容,如果未能解决你的问题,请参考以下文章
机器学习进阶-图像形态学变化-礼帽与黑帽 1.cv2.TOPHAT(礼帽-原始图片-开运算后图片) 2.cv2.BLACKHAT(黑帽 闭运算-原始图片)
形态学滤波:腐蚀与膨胀 开运算,闭运算,形态学梯度,顶帽,黑帽