opencv笔记(2):图像形态学

二、图像形态学

图像形态学最基本的操作是膨胀与腐蚀,特别说明:膨胀和腐蚀是对白色高亮部分进行操作的。它们能实现多种功能:
1.消除噪声。
2.分割出独立的图像元素,在图像中连接相邻的元素。
3.寻找图像中明显的极大值区域或极小值区域。
4.求出图像的梯度。

1.膨胀(dilate)

膨胀就是求局部最大值的操作,核B与图像卷积,即计算核B覆盖区域的像素点的最大值,然后把最大值给参考点指定的像素。这样就使得图像高亮的区域逐渐增长。


其数学表达式为:


void dilate(  
    InputArray src,  
    OutputArray dst,  
    InputArray kernel,  
    Point anchor=Point(-1,-1),  
    int iterations=1,  
    int borderType=BORDER_CONSTANT,  
    const Scalar& borderValue=morphologyDefaultBorderValue()   
); 
参数1:输入图像。
参数2:输出图像。
参数3:核。若为NULL,则表示使用参考点位于中心的3*3的核。一般使用函数getStructuringElement配合,它会返回指定的形状和尺寸结构元素。该函数有三个参数,第一个参数表示内核形状,其中形状有三个分别是:矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、椭圆形(MORPH_ELLIPSE)。第二个函数表示内核尺寸。第三个函数代表锚点位置。
 int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸  
   
//获取自定义核  
Mat element = getStructuringElement(MORPH_RECT,  
    Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),  
    Point( g_nStructElementSize, g_nStructElementSize )); 
参数4:锚点位置,默认值为(-1,-1),表示位于中心。
参数5:表示迭代使用函数的次数,默认值为1。
参数6:边界类型。
参数7:边界值。

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

2.腐蚀(erode)

相反的,腐蚀就是求局部最小值的操作。



void erode(  
    InputArray src,  
    OutputArray dst,  
    InputArray kernel,  
    Point anchor=Point(-1,-1),  
    int iterations=1,  
    int borderType=BORDER_CONSTANT,  
    const Scalar& borderValue=morphologyDefaultBorderValue()  
 );  
参数1:输入图像。
参数2:输出图像。
参数3:核。
参数4:锚点。
参数5:迭代次数。
参数6:边界类型。
参数7:边界值 。

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

3.开运算、闭运算、形态学梯度、顶帽、黑帽

开运算就是先腐蚀后膨胀。用来消除小物体,在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

闭运算就是先膨胀后腐蚀。能够排除小型黑洞(黑色区域)。


形态学梯度就是膨胀图与腐蚀图的差。对二值图像进行操作可以将团块的边缘突出出来,用来保留物体的边缘轮廓。


顶帽运算就是原图像与开运算的差。开运算是消除小物体,而同原图减去之后就会得到这些小物体。用来分离比邻近点亮一些的斑块。当一副图像具有大幅背景的时候,而微小物品比较有规律,可以进行北京提取。


黑帽运算就是闭运算与原图像的差。突出了比原图轮廓周围区域更暗的区域。用来分离比邻近点暗一些的斑块。


void morphologyEx(  
InputArray src,  
OutputArray dst,  
int op,  
InputArraykernel,  
Pointanchor=Point(-1,-1),  
intiterations=1,  
intborderType=BORDER_CONSTANT,  
constScalar& borderValue=morphologyDefaultBorderValue() ); 
参数1:输入图像。
参数2:输出图像。
参数3:表示形态学运算的类型。开运算(MORPH_OPEN)、闭运算(MORPH_CLOSE)、形态学梯度(MORPH_GRADIENT)、顶帽(MORPH_TOPHAT)、黑帽(MORPH_BLACKHAT)。
参数4:核。
参数5:锚点。
参数6:迭代次数。
参数7:边界类型。
参数8:边界值。

#include <opencv2/opencv.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include<opencv2/imgproc/imgproc.hpp>  
   
using namespace cv;  

int main( )  
{  
       //载入原始图    
       Mat image = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图  
       //创建窗口    
       namedWindow("【原始图】开运算");   
       namedWindow("【效果图】开运算");   
       //显示原始图   
       imshow("【原始图】开运算", image);   
       //定义核  
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));   
       //进行形态学操作  
       morphologyEx(image,image, MORPH_OPEN, element);  
       //显示效果图   
       imshow("【效果图】开运算", image);   
   
       waitKey(0);   
   
       return 0;   
}  

特别说明:本文为本人学习opencv所做笔记。具体参照:http://blog.csdn.net/column/details/opencv-tutorial.html




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值