腐蚀
erode函数
将各点像素值替换为对应邻域上的最小值,常用来去除图形的一些毛边
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() )
- InputArray src, 输入图形
- OutputArray dst, (输出图像:size与type与原始图像相同)
- InputArray kernel, (用于腐蚀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement来创建结构元素。)
- Point anchor=Point(-1,-1), (结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心)
- int iterations=1, (腐蚀操作被递归执行的次数)
- int borderType=BORDER_CONSTANT, (推断边缘类型,可参考BorderTypes)
- const Scalar& borderValue=morphologyDefaultBorderValue() (边缘值)
膨胀
dilate函数
膨胀操作是腐蚀操作的逆操作
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()
)
- InputArray src, 输入图形
- OutputArray dst, (输出图像:size与type与原始图像相同)
- InputArray kernel, (用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement来创建结构元素。)
- Point anchor=Point(-1,-1), (结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心)
- int iterations=1, (腐蚀操作被递归执行的次数)
- int borderType=BORDER_CONSTANT, (推断边缘类型,可参考BorderTypes)
- const Scalar& borderValue=morphologyDefaultBorderValue() (边缘值)
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()
)
Mat dilate_kernal = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); //膨胀核
cv::morphologyEx(fgmask, fgmask, cv::MORPH_OPEN, dilate_kernal);
- InputArray src, 输入图形
- OutputArray dst, (输出图像:size与type与原始图像相同)
- int op, 参看MorphTypes枚举类型,开操作为cv::MORPH_OPEN,闭操作为cv::MORPH_CLOSE
- InputArray kernel, (用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement来创建结构元素。)
- Point anchor=Point(-1,-1), (结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心)
- int iterations=1, (腐蚀操作被递归执行的次数)
- int borderType=BORDER_CONSTANT, (推断边缘类型,可参考BorderTypes)
- const Scalar& borderValue=morphologyDefaultBorderValue() (边缘值)
梯形运算
梯度运算等价于膨胀运算-腐蚀运算
对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓
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()
)
Mat gradient_kernal = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); //膨胀核
cv::morphologyEx(fgmask, fgmask, cv::MORPH_GRADIENT, gradient_kernal );
op输入为MORPH_GRADIENT即为梯形运算
顶帽操作和黑帽操作
顶帽操作
顶帽操作是源图像与图像开运算结果之间的差,它把开运算“去掉”的细节显现出来。
我们回顾下开运算的作用:
- 消除值高于邻近点的孤立点,达到去除图像中噪声的作用;
- 消除较小的连通域,保留较大的连通域;
- 断开较窄的狭颈,可以在两个物体纤细的连接处将它们分离;
- 不明显改变较大连通域的面积的情况下平滑连通域的连界、轮廓;
那么顶帽运算的作用便是:
- 把值高于邻近点的孤立点或斑块分离出来。
- 把较小的连通域分离出来。
- 把较窄的狭颈和两个物体的纤细连接处分离出来。
黑帽操作
黑帽操作是闭运算结果与原图像之间的差值,它把闭运算“增加”的细节显现出来。
我们回顾下闭运算的作用:
- 消除值低于邻近点的孤立点,达到去除图像中噪声的作用;
- 连接两个邻近的连通域;
- 弥合较窄的间断和细长的沟壑;
- 去除连通域内的小型空洞;
- 和开运算一样也能够平滑物体的轮廓;
那么黑帽运算的作用便是:
- 把值低于邻近点的孤立点或斑块分离出来。
- 把较窄的间断和细长的沟壑显现出来;
- 把连通域内的小型空洞显现出来
//博主微信/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;
}
参考原文链接:https://blog.csdn.net/wenhao_ir/article/details/124841757