opencv学习(九)形态学操作—开运算、闭运算、形态学梯度、顶帽、黑帽

本章的主角是morphologyEx函数,它利用基本的腐蚀和膨胀技术,来执行更加高级的形态学变换。

opencv中提供的API:

void morphologyEx(src, dst, int op, InputArray kernel, Point ancho, int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue())

第三个参数:选择使用什么形态学操作
           MORPH_OPEN - 开操作
           MORPH_CLOSE - 闭操作
           MORPH_GRADIENT - 形态学梯度
           MORPH_TOPHAT - 顶帽
           MORPH_BLACKHAT - 黑帽
           MORPH_HITMISS - 击中与击不中

一、开操作- open  

先腐蚀后膨胀的过程,数学表达式如下:

开运算可以用来消除小物体,在纤细处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。

Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
morphologyEx(src, dst, CV_MOP_OPEN, kernel);

效果图: 

二、 闭操作-close

先膨胀后腐蚀的过程,数学表达式如下:

闭运算可以填充小的黑洞。

Mat kernel = getStructuringElement(MORPH_RECT,Size(20,20),Point(-1,-1));
morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

效果图: 

这里写图片描述

三、形态学梯度- Morphological Gradient

     形态学梯度是膨胀减去腐蚀,数学表达式如下:

   对二值图进行这一操作可以将团块的边缘突出出来,我们可以用形态学梯度来保留物体的轮廓

//膨胀操作
Mat kernel = getStructuringElement(MORPH_RECT,Size(11,11),Point(-1,-1));
dilate(src,dest,kernel);

//腐蚀操作
erode(src,dest,kernel);
   
//基本梯度操作
morphologyEx(src,dest,MORPH_GRADIENT,kernel);
imshow("基本梯度操作",dest);

 这里写图片描述

四、顶帽 – top hat

     顶帽 是原图像与开操作之间的差值图像。

     因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。

    顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

//创建结构元素
Mat kernel = getStructuringElement(MORPH_RECT,Size(7,7),Point(-1,-1));
 //执行开操作
morphologyEx(src,dest,MORPH_OPEN,kernel);

//顶帽
morphologyEx(src,dest,MORPH_TOPHAT,kernel);
imshow("顶帽",dest);

 这里写图片描述

素材图:

五、黑帽

       黑帽是闭操作图像与源图像的差值图像

       黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。所以,黑帽运算用来分离比邻近点暗一些的斑块。

//创建结构元素
Mat kernel = getStructuringElement(MORPH_RECT,Size(7,7),Point(-1,-1));
//执行闭操作 
morphologyEx(src,dest,MORPH_CLOSE,kernel);

//黑帽
morphologyEx(src,dest,MORPH_BLACKHAT,kernel);
imshow("黑帽",dest);

这里写图片描述

素材图:

猜你喜欢

转载自blog.csdn.net/lhm_19960601/article/details/82561193