opencv-形态学高级操作

本文详细介绍OpenCV中的morphologyEx函数,解析其参数意义与使用方法,包括开闭运算、形态学梯度等高级图像处理技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

morphologyEx函数详解

morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,如开闭运算,形态学梯度,“顶帽”、“黑帽”等等。这一节我们来了解它的参数意义和使用方法。

C++: void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );

(1) 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
(2) 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
(3) 第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:>MORPH_OPEN – 开运算(Opening operation)

MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT -形态学梯度(Morphological gradient)
MORPH_TOPHAT - “顶帽”(“Top hat”)
MORPH_BLACKHAT - “黑帽”(“Black hat“

(4) 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。

 其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:

矩形: MORPH_RECT
交叉形: MORPH_CROSS
椭圆形: MORPH_ELLIPSE

  getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。

我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心。且需要注意,十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响了形态学运算结果的偏移。

(5) 第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
(6) 第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
(7) 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
(8) 第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

//开操作
        //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_OPEN, element);
//闭操作
       //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_CLOSE, element);
//形态学梯度
      //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_GRADIENT, element);

//顶帽运算
       //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_TOPHAT, element)
//黑帽运算
       //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_BLACKHAT, element);

//腐蚀
       //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_ERODE, element);

//膨胀
       //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_DILATE, element);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值