OpenCV第五讲: 形态学滤波
形态学的基本运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰度腐蚀和膨胀等
1. 腐蚀、膨胀
形态学操作就是基于形状的一系列图像处理操作,本文中的膨胀是对图像的高亮部分进行膨胀,腐蚀是对原图中的高亮部分被腐蚀。从数学角度来讲,这两种操作就是将图像与核
进行卷积。
-
膨胀
就是求局部最大值操作,将图像与
核
卷积,即计算核覆盖区域的像素点的最大值,然后将这个最大值赋给参考点指定的像素。 -
腐蚀
与膨胀刚好相反,它是求局部最小值, 但计算和原理类似。
-
通俗理解和解释
从实现效果看,
膨胀
相当于将原图像的局部亮度调亮,使得图像的对比度缺失;腐蚀
相当于将图像局部亮度降低,增加了区域之间的对比度,但掩盖了部分细节。 -
OpenCV函数
dilate #膨胀 erode #腐蚀
2. 开运算、闭运算、形态学梯度、顶帽、黑帽
利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换。
-
开运算
先腐蚀后膨胀, 可以用来消除小物体。
open(src, element) = dilate( erode(src, element) )
-
闭运算
先膨胀后腐蚀, 能够排除小型黑洞。
close(src, elemet) = erode( dilate(src, element) )
-
形态学梯度
是膨胀图与腐蚀图之差,可以用来保留物体的边缘轮廓。
dst = morph - grad(src, element) = dilate(src, element) - erode(src, element)
-
顶帽
是原图像与开运算结果图之差,用来分离比临近点亮一些 的斑块,在一定情况下,可以使用顶帽运算进行背景提取。--
提取背景
dst = tophat(src, element) = src - open(src, element)
-
闭帽
是原图像与闭运算结果图之差,用来分离比临近点暗一些的斑块,可以较好的提取物体的轮廓信息。--
提取轮廓
dst = blackhat(src, element) = close(src, element) - src
3. 源代码剖析
利用morphologyEx()
函数可以实现多种高级形态学变换(上述所讲都可实现)。
/*********************************************************************
* 形态学操作:
* void 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() );
* op: 选择各种不同的形态学操作
*
* enum MorphTypes{
MORPH_ERODE = 0, //!< see cv::erode
MORPH_DILATE = 1, //!< see cv::dilate
MORPH_OPEN = 2, //!< an opening operation
MORPH_CLOSE = 3, //!< a closing operation
MORPH_GRADIENT = 4, //!< a morphological gradient
MORPH_TOPHAT = 5, //!< "top hat"
MORPH_BLACKHAT = 6, //!< "black hat"
MORPH_HITMISS = 7 //!< "hit or miss"
//!< .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation
};
cv::MorphTypes -- 不同的形态学操作
cv::MorphShapes -- 核的不同形状
-- 获取不同大小的内核函数
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
*******************************************************************/
cv::Mat morImg;
Mat He_element = getStructuringElement(0, Size(15,15)); // cv::MorphShapes
morphologyEx(srcImage, morImg, 4, He_element);
imshow("形态学操作", morImg);