1 腐蚀
大家应该知道,膨胀和腐蚀(erode)是相反的一对操作,所以腐蚀就是求局部最小值的操作。
我们一般都会把腐蚀和膨胀进行对比理解和学习。下文就可以看到,两者的函数原型也是基本一样的。腐蚀操作示例如下图所示。
腐蚀的数学表达式如下。
下图给出了毛笔字的腐蚀效果示例。
2 腐蚀:erode 函数
erode函数使用像素邻域内的局部极小运算符来腐蚀一张图片,从src输入,由dst输出。支持就地(in-place)操作。
看一下函数原型,如下。
参数详解如下。
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F其中之一。
- 第二个参数,OutputArray 类型的 dst,即目标图像,需要和源图片有一样的尺寸和类型。
- 第三个参数,InputArray类型的kernel,腐蚀操作的内核。为NULL时,表 示的是使用参考点位于中心3x3的核。一般使用函数 getStructuringElement 配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵,具体看上文中dilate函数的第三个参数讲解部分。
- 第四个参数,Point 类型的 anchor,锚的位置。其有默认值(—1,—1),表示锚位于单位(element)的中心,一般不用管它。
- 第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1。
- 第六个参数,int类型的 borderType,用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT。
- 第七个参数,const Scalar&类型的 borderValue,当边界为常数时的边界值, 有默认值 morphologyDefaultBorderValue(),一般不用去管它。需要用到它 时,可以看官方文档中的 createMorphologyFilter()函数以得到更详细的解释。
同样的,使用erode 函数,一般只需要填前面的三个参数,后面的四个参数都有默认值。而且往往结合 getStructuringElement一起使用。
3 示例
代码:
//---------------------------------【头文件、命名空间包含部分】--------------------------------
// 描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
//-----------------------------------【main( )函数】-----------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//------------------------------------------------------------------------------------------
int main( )
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示原图
imshow("【原图】腐蚀操作", srcImage);
//进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstImage;
erode(srcImage, dstImage, element);
//显示效果图
imshow("【效果图】腐蚀操作", dstImage);
waitKey(0);
return 0;
}
原图
效果图
对比图