形态学是图像处理畛域的一个分支,次要用于形容和解决图像中的形态和构造。形态学能够用于提取图像中的特色、打消噪声、扭转图像的形态等。其中形态学的外围操作是形态学运算。
形态学运算是一种基于形态的图像处理技术,它是通过构造元素与图像进行特定运算的形式来扭转图像的状态和特色。构造元素是一种小型、预约义的形态,通常是矩形、圆形或者椭圆形,能够与图像中的像素进行匹配。
形态学运算包含收缩、侵蚀、开运算、闭运算等。其中收缩操作能够将图像中的物体变大,使它更加连通;侵蚀操作则能够将图像中的物体变小,使它更加细化;开运算能够去除噪声,平滑图像的边缘;闭运算能够填补图像中物体的孔洞。
形态学在图像处理中利用宽泛,特地是在图像宰割、边缘检测、文本辨认、计算机视觉等畛域中。
形态学操作概念
形态学运算是一种依据图像的形态对其进行解决的技术。它通过比拟相邻像素来构建图像。对于二进制图像 ({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 的 2 ×2 构造元素作为演示:
另外一张是 6 ×6 像素的图片。其中红色元素强度值为 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