1、前言
(1)腐蚀
消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;
(2)膨胀
把与物体接触的所有背景点合并到物体中,使目标增大,可知添补目标中的空洞。
(3)开运算
先腐蚀后膨胀的过程,可以消除图像上道细小的噪声,并平滑物体边界。
(4)闭运算
先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物容体边界。
(5)梯度运算
膨胀结果图像与腐蚀膨胀结果图像的差值图像
(6)顶帽运算
原图像与开运算结果图像的差值图像
(7)黑帽运算
闭运算结果图像与原图像的差值图像
2、相关的API函数
(1)膨胀
void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
(2)腐蚀
void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
(3)取得结构元素
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
其中, int shape:
MORPH_RECT= 0, // 矩形结构元素
MORPH_CROSS= 1, // 十字结构元素
MORPH_ELLIPSE= 2 // 椭圆结构元素
(4)形态学组合操作
是膨胀和腐蚀运算的组合运算。
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() );
其中,int op =
CV_MOP_ERODE =0 // 腐蚀
CV_MOP_DILATE =1 // 膨胀
CV_MOP_OPEN =2// 开运算
CV_MOP_CLOSE =3//闭运算
CV_MOP_GRADIENT =4// 梯度
CV_MOP_TOPHAT =5 // 顶帽运算
CV_MOP_BLACKHAT =6 // 黑帽运算
3、相关功能的源代码
腐蚀运算
void Erosion_Image(int, void*)
{
int erosion_type;
int typex[] = { MORPH_RECT ,MORPH_CROSS, MORPH_ELLIPSE };
erosion_type = typex[erosion_index];
Mat element = getStructuringElement(erosion_type,
Size(2 * erosion_size + 1, 2 * erosion_size + 1),
Point(erosion_size, erosion_size));
Mat erodeMatx = getStructuringElement(erosion_type, Size(3, 3));
erode(srcImg1, erodeMat, element);// 腐蚀操作
imshow("Erosion", erodeMat);
}
膨胀运算
void Dilation_Image(int, void*)
{
int dilation_type;
int typex[] = { MORPH_RECT ,MORPH_CROSS, MORPH_ELLIPSE };
dilation_type = typex[dilation_index];
Mat element = getStructuringElement(dilation_type,
Size(2 * dilation_size + 1, 2 * dilation_size + 1),
Point(dilation_size, dilation_size));
///膨胀操作
dilate(srcImg1, dilateMat, element);
imshow("Dilation", dilateMat);
}
形态学组合运算
void Morphology_Image(int, void*)
{
int op;
int ops[] = { CV_MOP_ERODE ,
CV_MOP_DILATE,
CV_MOP_OPEN,
CV_MOP_CLOSE,
CV_MOP_GRADIENT,
CV_MOP_TOPHAT,
CV_MOP_BLACKHAT };
op = ops[moph_op_index];
Mat element = getStructuringElement(MORPH_RECT,
Size(2 * 1 + 1, 2 * 1 + 1));
morphologyEx(srcImg1, morphMat, op, element);
imshow("Moph", morphMat);
}
4、形态学操作应用
使用函数morphologyEx()作直线的提取。
void Morphology_Extract_HLine()
{
Mat kernel = getStructuringElement(MORPH_RECT,
Size(srcImg1.cols / 10, 1));
Mat grayMat;
Mat binMat;
cvtColor(srcImg1, grayMat, CV_BGR2GRAY);
adaptiveThreshold(grayMat, binMat, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
morphologyEx(binMat, hLineMat, CV_MOP_OPEN, kernel);
imshow("H Line", hLineMat);
}
5、工程源代码下载
本文件源程序在Debug–x64下编译运行通过。
Zip包中包含开发环境,解压后可直接编译