【OpenCV C++20 学习笔记】形态学变换(morphologyEx)

理论

开运算

开运算实际上就是腐蚀之后再膨胀,用公式表达就是:
d s t = o p e n ( s r c , e l e m e n t ) = d i l a t e ( e r o d e ( s r c , e l e m e n t ) ) dst=open(src, element) = dilate(erode(src, element)) dst=open(src,element)=dilate(erode(src,element))

  • d s t dst dst是对应计算中的目标图片
  • s r c src src是对应计算中的原图片
  • e l e m e n t element element为对应计算中的卷积核
  • o p e n open open为开运算; d i l a t e dilate dilate为膨胀运算; e r o d e erode erode为腐蚀运算
  • 关于膨胀和腐蚀运算,可以参考我的另一篇文章《腐蚀和膨胀》

这种操作对于消除小的图像元素非常有效,但消除的元素必须是在暗背景中的亮的元素。
下图左边就是原图,右边是开运算后的效果:
开运算效果

闭运算

与开运算相反,它是在膨胀之后,再腐蚀,用公式表示就是:
d s t = c l o s e ( s r c , e l e m e n t ) = e r o d e ( d i l a t e ( s r c , e l e m e n t ) ) dst=close(src, element) = erode(dilate(src, element)) dst=close(src,element)=erode(dilate(src,element))

  • d s t dst dst是对应计算中的目标图片
  • s r c src src是对应计算中的原图片
  • e l e m e n t element element为对应计算中的卷积核
  • c l o s e close close为闭运算; d i l a t e dilate dilate为膨胀运算; e r o d e erode erode为腐蚀运算
    它的效果与开运算也相反,虽然同样能消除小的图像元素,但消除的元素必须是在亮背景上的暗的元素。
    下图左边是原图,右边是闭运算后的效果:
    闭运算效果

形态学梯度

形态学梯度实质上是图像在膨胀和腐蚀之间的差,用公式表示就是:
d s t = m o r p h g r a d ( s r c , e l e m e n t ) = d i l a t e ( s r c , e l e m e n t ) − e r o d e ( s r c , e l e m e n t ) dst=morph_{grad}(src, element)=dilate(src, element)-erode(src, element) dst=morphgrad(src,element)=dilate(src,element)erode(src,element)

  • d s t dst dst是对应计算中的目标图片
  • s r c src src是对应计算中的原图片
  • e l e m e n t element element为对应计算中的卷积核
  • m o r p h g r a d morph_{grad} morphgrad为形态学梯度运算; d i l a t e dilate dilate为膨胀运算; e r o d e erode erode为腐蚀运算
    形态学梯度在找出图像元素的轮廓中非常有用。
    下图左边是原图,右边是形态学梯度运算后的效果:
    形态学梯度效果

顶帽运算

顶帽运算计算的是原图和它的开运算之间的差,用公式表示就是:
d s t = t o p h a t ( s r c , e l e m e n t ) = s r c − o p e n ( s r c , e l e m e n t ) dst=tophat(src, element)=src-open(src, element) dst=tophat(src,element)=srcopen(src,element)

  • d s t dst dst是对应计算中的目标图片
  • s r c src src是对应计算中的原图片
  • e l e m e n t element element为对应计算中的卷积核
  • t o p h a t tophat tophat为顶帽运算; o p e n open open为开运算
    顶帽运算往往用来消除比邻近点亮一些的斑块。
    下图左边是原图,右边是顶帽运算的效果:
    顶帽运算效果

黑帽运算

黑帽运算是闭运算与原图之间的差,用公式表示就是:
d s t = b l a c k h a t ( s r c , e l e m e n t ) = c l o s e ( s r c , e l e m e n t ) − s r c dst = blackhat(src, element)= close(src, element)-src dst=blackhat(src,element)=close(src,element)src

  • d s t dst dst是对应计算中的目标图片
  • s r c src src是对应计算中的原图片
  • e l e m e n t element element为对应计算中的卷积核
  • b l a c k h a t blackhat blackhat为黑帽运算; c l o s e close close为闭运算
    黑帽运算与顶帽运算相反,往往用来消除比邻近点暗一些的斑块
    下图左边是原图,右边是黑帽运算的效果:
    黑帽运算效果

代码实现

创建卷积核

Mat element = getStructuringElement(MORPH_RECT,		//核的形态
									Size(3, 3),		//核的尺寸,默认3*3
									Point(-1, -1));	//核的锚点,(-1,-1)表示核的中心

其中第1个参数决定了卷积核的形态,有以下枚举类型:

  • MORPH_RECT:矩形
  • MORPH_CROSS:十字形
  • MORPH_ELLIPSE:椭圆形

形态学变换运算

morphologyEx(src,		//原图
			dst,		//目标图
			operation,	//形态学变换运算类型
			element);	//卷积核

其中第3个参数决定了使用上述哪种形态学变换运算类型:

  • MORPH_OPEN:开运算,对应整数2
  • MORPH_CLOSE:闭运算,对应整数3
  • MORPH_GRADIENT:形态学梯度运算,对应整数4
  • MORPH_TOPHAT:顶帽运算,对应整数5
  • MORPH_BALCKHAT:黑帽运算,对应整数6
  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值