opencv学习笔记(五)----形态学运算

腐蚀与膨胀

功能:
- 消除噪声
- 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度 

膨胀

对图像中的高亮部分进行膨胀,效果图拥有比原图更大的高亮区域。即白色部分。

 void dilate(  
    InputArray src,   //输入
    OutputArray dst,    //输出
    InputArray kernel,    //核
    Point anchor=Point(-1,-1),  //锚  
    int iterations=1,    //迭代次数
    int borderType=BORDER_CONSTANT,  
    const Scalar& borderValue=morphologyDefaultBorderValue()   
);

核kernel若为null,则表示用参考点在中心的3*3的核
一般使用getStructuringElement函数配合使用

int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸  
   
//获取自定义核  
Mat element = getStructuringElement(MORPH_RECT,  //内核形状:矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、椭圆形:(MORPH_ELLIPSE)
    Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),  //内核尺寸
    Point( g_nStructElementSize, g_nStructElementSize )  //瞄点位置
    );  

代码示例 

//载入原图   
Mat image = imread("1.jpg");  
//获取自定义核  
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
Mat out;  
//进行膨胀操作  
dilate(image, out, element);

腐蚀

和膨胀类似。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。

void erode(  
    InputArray src,  
    OutputArray dst,  
    InputArray kernel,  
    Point anchor=Point(-1,-1),  
    int iterations=1,  
    int borderType=BORDER_CONSTANT,  
    const Scalar& borderValue=morphologyDefaultBorderValue()  
 ); 

代码示例

//载入原图   
Mat image = imread("1.jpg");  
//获取自定义核  
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
Mat out;  
//进行腐蚀操作  
erode(image,out, element);  

高级形态学变换

void morphologyEx(  
    InputArray src,  
    OutputArray dst,  
    int op,  //形态学运算类型。MORPH_OPEN(开运算)、MORPH_CLOSE(闭运算)、MORPH_GRADIENT(形态学梯度)、MORPH_TOPHAT(“顶帽”)、MORPH_BLACKHAT(“黑帽”)   InputArray kernel,  
    Pointanchor=Point(-1,-1),  
    intiterations=1,  
    intborderType=BORDER_CONSTANT,  
    constScalar& borderValue=morphologyDefaultBorderValue() 
);  

和腐蚀与膨胀类似,morphologyEx函数通过改变op参数即可实现对图像的开闭梯度黑帽顶帽运算。 开运算:对图像先腐蚀再膨胀,可以排除小团块物体 闭运算:对图像先膨胀再腐蚀,可以排除小型黑洞 形态梯度:膨胀图与腐蚀图之差,可以保留边缘轮廓 顶帽:原图与开运算的差 黑帽:闭运算与原图的差

int main( )  
{     
   Mat image = imread("1.jpg");   
   //定义核  
   Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));   
   //进行形态学操作  
   morphologyEx(image,image, MORPH_BLACKHAT, element);  
   //显示效果图   
   namedWindow("【效果图】黑帽运算"); 
   imshow("【效果图】黑帽运算", image);   
   waitKey(0);   
   return 0;   
} 

猜你喜欢

转载自blog.csdn.net/ZYhhhh233/article/details/80496480