腐蚀和膨胀
- 形态学原理
- 膨胀
- 腐蚀
- 代码实现
- 膨胀函数
- 腐蚀函数
- 运行结果
形态学原理
腐蚀和膨胀通常有以下用途:
- 去除噪音
- 分离或合并图像中的元素
- 找出图片上的强度的极大值区域和极小值区域
以下图作为原始图片:
膨胀
用核
B
B
B来扫描图像
A
A
A,核
B
B
B中有个锚点,通常是核的中心。在扫描图像的时候,被
B
B
B覆盖的
A
A
A的区域上的最大值将会被赋予核
B
B
B的锚点。这样图片中像素值高的区域(亮的区域)将会扩大,这就是“膨胀”。如下图所示:
用数学公式来表达就是:
d
s
t
(
x
,
y
)
=
m
a
x
(
x
′
,
y
′
)
:
e
l
e
m
e
n
t
(
x
′
,
y
′
)
≠
0
s
r
c
(
x
+
x
′
,
y
+
y
′
)
dst(x,y)=max_{(x', y'):element(x',y')\neq0}src(x+x',y+y')
dst(x,y)=max(x′,y′):element(x′,y′)=0src(x+x′,y+y′)
- d s t ( x , y ) dst(x,y) dst(x,y)为 x x x行 y y y列的像素值的膨胀结果
- s r c ( x , y ) src(x,y) src(x,y)为 x x x行 y y y列的原始像素值
- x ′ x' x′和 y ′ y' y′分别为最大值在核中的坐标
膨胀后的效果:
腐蚀
腐蚀的操作与膨胀正好相反,它将核
B
B
B中的最小值赋予核的锚点。这样像素值小的区域(暗的区域)就会变多。如下图所示:
用数学公式表达如下:
d
s
t
(
x
,
y
)
=
m
i
n
(
x
′
,
y
′
)
:
e
l
e
m
e
n
t
(
x
′
,
y
′
)
≠
0
s
r
c
(
x
+
x
′
,
y
+
y
′
)
dst(x,y)=min_{(x', y'):element(x',y')\neq0}src(x+x',y+y')
dst(x,y)=min(x′,y′):element(x′,y′)=0src(x+x′,y+y′)
- d s t ( x , y ) dst(x,y) dst(x,y)为 x x x行 y y y列的像素值的膨胀结果
- s r c ( x , y ) src(x,y) src(x,y)为 x x x行 y y y列的原始像素值
- x ′ x' x′和 y ′ y' y′分别为最大值在核中的坐标
腐蚀效果如下:
代码实现
在OpenCV中,在进行膨胀和腐蚀操作前都必须先创建用来扫描原始图片的“核”,这就要用到getStructuringElement()
函数:
Mat element = getStructuringElement(MORPH_RECT, //核的形态
Size(3, 3), //核的尺寸,默认3*3
Point(-1, -1)); //核的锚点,(-1,-1)表示核的中心
其中第1个参数,有以下枚举类型:
MORPH_RECT
:矩形MORPH_CROSS
:十字形MORPH_ELLIPSE
:椭圆形
这样就会自动创建全是1的一个卷积核矩阵,如下图:
接下来就可以进行膨胀和腐蚀操作了:
膨胀函数
膨胀函数非常简单:
dilate(image, //原图
DImage, //目标图
element); //核
腐蚀函数
腐蚀函数也非常简单:
erode(image, //原图
EImage, //目标图
element); //核
运行结果
中间是原图,左边是膨胀,右边是腐蚀: