V · 2023年05月12日 · 北京市

形态学运算与仿真:图像处理中形态学操作的简单解释

形态学是图像处理领域的一个分支,主要用于描述和处理图像中的形状和结构。形态学可以用于提取图像中的特征、消除噪声、改变图像的形状等。其中形态学的核心操作是形态学运算。

形态学运算是一种基于形状的图像处理技术,它是通过结构元素与图像进行特定运算的方式来改变图像的形态和特征。结构元素是一种小型、预定义的形状,通常是矩形、圆形或者椭圆形,可以与图像中的像素进行匹配。

形态学运算包括膨胀、腐蚀、开运算、闭运算等。其中膨胀操作可以将图像中的物体变大,使它更加连通;腐蚀操作则可以将图像中的物体变小,使它更加细化;开运算可以去除噪声,平滑图像的边缘;闭运算可以填补图像中物体的孔洞。

形态学在图像处理中应用广泛,特别是在图像分割、边缘检测、文本识别、计算机视觉等领域中。

形态学操作概念

形态学运算是一种根据图像的形状对其进行处理的技术。它通过比较相邻像素来构建图像。对于二进制图像({0,1}或{0,255}),这种操作会十分的简单。

在熟悉形态学操作之前,我们需要了解一些基本术语

Structuring Element 被翻译为结构元素或结构单元,也称为structuring function或者structuring kernel,是形态学中用于进行形态学运算的一种预定义的、小型的形状。SE通常是一个矩阵或者一个类似于核心的图形。

SE定义了用于改变图像形态的操作,例如膨胀、腐蚀、开运算和闭运算等。这些操作基于SE与图像中像素的匹配和计算。SE在运算中可以通过平移、旋转和翻转等操作进行变换。

形态学操作是通过在图像中传播结构元素来完成的。通过比较结构元素下的像素,在图像的原点位置改变像素值。所以SE的大小和形状选择是非常关键的,不同的SE可以产生不同的结果。通常情况下,SE的形状和大小需要根据图像的特征和处理目的来选择。例如,矩形形状的SE通常适用于处理直线形状的图像,而圆形形状的SE适用于处理圆形和椭圆形的图像。

Miss:如果图像中没有一个像素与结构元素匹配,则称为Miss。

Hit:当结构元素的至少一个像素与图像像素重叠时,称为Hit。

Fit:如果结构元素的所有像素都与图像匹配,则称为Fit。

形态学基本操作

形态学有两种形态操作:腐蚀、膨胀。另外两个常用的复合操作开、闭也是从这两个操作派生出来的。

1、Erosion 侵蚀,也被翻译成腐蚀:结构元素对对象的每个像素进行卷积。如果结构元素的所有像素与目标图像像素重叠(满足Fit条件),则将目标图像像素填充前景像素强度值。否则,将填充背景像素强度值。

假设背景为0,前景为1,那么伪代码就是:

 if Fit -> 1 else -> 0

使用了一个强度为1的2x2结构元素作为演示:

另外一张是6x6像素的图片。其中白色元素强度值为0,蓝色像素强度值为1。

结构元素对给定图像的每个像素进行卷积。如果它满足未Fit条件,它将在结构元素的原点位置将像素更改为0。上面我们已经用红色显示了像素从1到0的位置。最后得到以下结果。

可以看到主图像像素由于腐蚀而减少。Opnecv为我们提供了很好的实现,我们可以直接使用:

 import cv2
 import matplotlib.pyplot as plt
 import numpy as np
 img4=cv2.imread('/work/morphology_er.png',cv2.IMREAD_GRAYSCALE)
 plt.imshow(img4, cmap='gray')
 plt.show()

我们的图像是白色背景上的黑色。但是OpenCV需要黑色背景和白色图像对象来进行形态学操作。所以我们使用逆二值化。在形态学操作后再次进行二值阈值逆处理,以保留白色背景和黑色物体。

 thr,img_th = cv2.threshold(img4,127,255,cv2.THRESH_BINARY_INV)
 kernel=np.ones((5,5), np.uint8)
 new_h=cv2.erode(img_th,kernel,iterations=3)
 ret,correction= cv2.threshold(new_h,127,255,cv2.THRESH_BINARY_INV)
 plt.imshow(correction,cmap='gray')
 plt.show()

可以看到,腐蚀会消除小的物体或者细节。

 img5=cv2.imread('/work/morphology_ero.png',cv2.IMREAD_GRAYSCALE)
 plt.imshow(img5, cmap='gray')
 plt.show()

 thr,img_th = cv2.threshold(img5,127,255,cv2.THRESH_BINARY_INV)
 kernel=np.ones((5,5), np.uint8)
 new_h=cv2.erode(img_th,kernel,iterations=3)
 ret,correction= cv2.threshold(new_h,127,255,cv2.THRESH_BINARY_INV)
 plt.imshow(correction,cmap='gray')
 plt.show()

或者使我们的物体变小,或者断开彼此之间的连接

2、Dilation 膨胀 :结构元素在物体图像上进行卷积。如果任何结构元素的像素值与目标图像重叠(满足Hit条件),则目标图像像素将被前景像素强度值填充。否则,像素强度值将保持不变。

伪代码如下:

 If Hit -> 1 else -> 0

我们还是使用上面的例子:

完成操作后,它产生如下所示的结果。

膨胀会增加物体图像的像素。我们继续使用OpenCV演示:

 img3=cv2.imread('/work/morphology_di.png',cv2.IMREAD_GRAYSCALE)
 plt.imshow(img3, cmap='gray')
 plt.show()

 thr,img_th = cv2.threshold(img3,127,255,cv2.THRESH_BINARY_INV)
 kernel=np.ones((5,5), np.uint8)
 new_h=cv2.dilate(img_th,kernel,iterations=3)
 ret,correction= cv2.threshold(new_h,127,255,cv2.THRESH_BINARY_INV)
 plt.imshow(correction,cmap='gray')
 plt.show()

膨胀可以用于将物体扩大或连接起来,填补物体内部的空洞或裂缝

复合操作

还有一些其他的复合形态操作。其中,开和闭是两种应用广泛的操作。

可以看到,开操作Open先对图像进行腐蚀操作,然后再进行膨胀操作的组合过程,可以用于消除小的物体或细节,并且可以平滑物体的边界

闭操作Close则相反,它是先对图像进行膨胀操作,然后再进行腐蚀操作的组合过程。可以用于填补小的空洞或裂缝,并且也可以平滑物体的边界。

Opencv也提供了内置的实现:

 opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
 closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)

总结

形态学是一种基于形状和结构的图像处理方法,其核心是结构元素(SE)的定义和运算。SE是一个小的形状,通常是一个矩阵或者类似核心的图形,用于进行形态学运算,如腐蚀、膨胀、开运算和闭运算等。这些运算可以用于消除噪声、填补空洞、连接物体和分离物体等。

形态学的运算和SE的选择对图像处理结果具有重要影响,因此需要根据图像的特征和处理目的来选择合适的SE和运算。除了基本的形态学运算,形态学还可以用于形状分析、特征提取、目标识别等领域,具有广泛的应用。

https://avoid.overfit.cn/post/8b49f4cdb26045a8969c8e53fa543533

作者:Zubair

推荐阅读
关注数
4143
内容数
724
SegmentFault 思否旗下人工智能领域产业媒体,专注技术与产业,一起探索人工智能。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息