@TOC
理论
开运算
开运算实际上就是腐蚀之后再膨胀,用公式表达就是:
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)=src−open(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
:开运算,对应整数2MORPH_CLOSE
:闭运算,对应整数3MORPH_GRADIENT
:形态学梯度运算,对应整数4MORPH_TOPHAT
:顶帽运算,对应整数5MORPH_BALCKHAT
:黑帽运算,对应整数6