【OpenCV C++20 学习笔记】腐蚀和膨胀

垚武田 2024-08-04 08:31:01 阅读 97

腐蚀和膨胀

形态学原理膨胀腐蚀

代码实现膨胀函数腐蚀函数运行结果

形态学原理

腐蚀和膨胀通常有以下用途:

去除噪音分离或合并图像中的元素找出图片上的强度的极大值区域和极小值区域

以下图作为原始图片:

原始图片

膨胀

用核

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′)=0​src(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′)=0​src(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中,在进行膨胀和腐蚀操作前都必须先创建用来扫描原始图片的“核”,这就要用到<code>getStructuringElement()函数

Mat element = getStructuringElement(MORPH_RECT,//核的形态

Size(3, 3),//核的尺寸,默认3*3

Point(-1, -1));//核的锚点,(-1,-1)表示核的中心

其中第1个参数,有以下枚举类型:

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

这样就会自动创建全是1的一个卷积核矩阵,如下图:

卷积核矩阵

接下来就可以进行膨胀和腐蚀操作了:

膨胀函数

膨胀函数非常简单:

<code>dilate(image,//原图

DImage,//目标图

element);//核

腐蚀函数

腐蚀函数也非常简单:

erode(image,//原图

EImage,//目标图

element);//核

运行结果

中间是原图,左边是膨胀,右边是腐蚀:

膨胀和腐蚀对比原图



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。