形态学操作包含以下操作:
- 腐蚀 (Erosion)
- 膨胀 (Dilation)
- 开运算 (Opening)
- 闭运算 (Closing)
- 形态梯度 (Morphological Gradient)
- 顶帽 (Top Hat)黑帽(Black Hat)
其中腐蚀和膨胀操作是最基本的操作,其他操作由这两个操作变换而来。
腐蚀
用一个结构元素扫描图像中每一个像素,结构元素中的每一个像素与其覆盖像素与操作,都为1,则该像素为1,否则为0,腐蚀的作用是消除物体边界点,消除小于结构元素的噪声点。
void erode( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
src,dst:输入输出图像,可以相同;
kernel:结构元素,一般使用Ma来确定结构元素;
anchor:结构元素的描点;
iterations:操作次数;
borderType:边界类型;
borderValue:边界值,当borderType=BORDER_CONSTANT时有效;
实例:
Mat kernal = Mat::ones(3,3,CV_8UC1);kernal.at<uchar>(0,1) = 0;kernal.at<uchar>(1,1) = 0;kernal.at<uchar>(2,1) = 0;cv::erode(_src,_src,kernal,Point(-1,-1),3);
原始图像
腐蚀图像
膨胀
void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
参数意义与腐蚀完全相同
实例
Mat kernal = Mat::ones(3,3,CV_8UC1);kernal.at<uchar>(1,0) = 0;kernal.at<uchar>(1,1) = 0;kernal.at<uchar>(1,2) = 0;cv::dilate(_src,_src,kernal,Point(-1,-1),3);
膨胀图像
开运算
开运算是先腐蚀后膨胀,作用是分离物体,消除小区域,消除噪点,而不影响原来图像
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设置为MORPH_OPEN
实例:
Mat kernal = Mat::ones(3,3,CV_8UC1);
cv::morphologyEx(src,src,MORPH_OPEN,kernal,Point(-1,-1),2);
原图:
开运算后的图像:
闭运算
闭运算是先膨胀后腐蚀,作用是消除闭合物体里面的孔洞,可以填充闭合区域。
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设置为MORPH_CLOSE
形态梯度
膨胀图与腐蚀图之差,能够保留物体的边缘轮廓。
cv.morphologyEx(img,cv.MORPH_TOPHAT)
礼帽运算
原图像与开运算的结果差,开运算放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,操作和选择的核的大小相关。礼帽运算用来分离比邻近点亮一些的斑块。 当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
cv.morphologyEx(img,cv.MORPH_TOPHAT)
黑帽运算
闭运算的结果图与原图像之差,闭运算填充了裂缝或者扩大局部高亮度的区域,因此,从结果图中减去原图后,得到的效果图突出了比原图区域更暗的区域,且这一操作和选择的核的大小相关,黑帽运算用来分离比邻近点暗一些的斑块。
cv.morphologyEx(img,cv.MORPH_BLACKHAT)