形态学转换是一些基于图像形状的简单操作。 它通常在二进制图像上执行。
1. 腐蚀、膨胀
腐蚀和膨胀是最基本的形态学操作。
1.1 腐蚀
腐蚀就是原图的高光区域被吃掉了,效果图的高光区域比原图小。 腐蚀的作用是消除物体的边界点,使目标变小,消除比结构元素小的噪声点。 腐蚀是寻找局部最小值的操作。
具体操作是:用一个结构元素扫描图像中的每个像素,将结构元素中的每个像素与它所覆盖的像素进行AND运算。 如果两者都为1,则像素为1,否则为0。 如下图,结构A被结构B腐蚀后:
cv.erode(img,kernel,iterations)
参数:
img 要处理的图像
kernel 核结构
iterations 腐蚀的次数,默认是1
1.2 膨胀
膨胀是将图像的高亮部分扩大,效果图比原图有更大的高亮区域。 膨胀的作用是将所有与物体接触的背景点合并到物体中,从而扩大目标,填补目标中的空洞。 膨胀是寻找局部最大值的操作。
具体操作是:用结构元素扫描图像中的每个像素,用结构元素中的每个像素与其覆盖的像素进行或运算。 如果两者都为0,则像素为0,否则为1。 如下图,结构A被结构B膨胀后:
cv.dilate(img,kernel,iterations)
参数:
img 要处理的图像
kernel 核结构
iterations 膨胀的次数,默认是1
例1:使用5*5的核结构对图中的字母进行腐蚀和膨胀操作。
import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
img = cv.imread("./image/letter.png")
# 创建核结构
kernel = np.ones((5, 5), np.uint8)
# 腐蚀
img1 = cv.erode(img, kernel)
plt.imshow(img1[:, :, ::-1])
plt.title("腐蚀")
plt.show()
# 膨胀
img2 = cv.dilate(img, kernel)
plt.imshow(img2[:, :, ::-1])
plt.title("膨胀")
plt.show()
输出:
2. 开运算、闭运算、礼帽运算、黑帽运算
2.1 开运算
开运算是先腐蚀后膨胀,它的作用是分离物体,消除小区域。
特点:消除噪声,去除小干扰块,而不影响原来的图像。
2.2 闭运算
闭运算与开运算相反,是先膨胀后腐蚀,作用是消除封闭物体上的孔洞。
特点:可以填充封闭区域。
2.3 礼帽运算
礼帽运算的结果是原图像和图像的开运算的结果图像之间的差。
礼帽运算突出显示比原始图像轮廓周围区域更亮的区域,并用于分离比相邻区域更亮的斑点。 当一张图片的背景很大,小物体比较规则的时候,可以使用礼帽运算计算来提取背景。
2.4 黑帽运算
黑帽运算结果是原图像与图像的闭运算的结果图像之间的差。
黑帽运算后的效果图突出显示比原图轮廓周围区域更暗的区域,此操作与所选核的大小有关。黑帽运算用于分离比相邻点更暗的斑点。
cv.morphologyEx(img, op, kernel)
参数:
img 要处理的图像
op 处理方式:
cv.MORPH_OPEN 开运算
cv.MORPH_CLOSE 闭运算
cv.MORPH_TOPHAT 礼帽运算
cv.MORPH_BLACKHAT 黑帽运算
kernel 核结构
例2:使用10*10的核结构,对这个图像进行开运算和礼帽操作。
并对这个图像进行闭运算和黑帽操作。
import matplotlib
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
# 读取图像
open = cv.imread("./image/letteropen.png")
close = cv.imread("./image/letterclose.png")
# 设置运算核
kernel = np.ones((10, 10), np.uint8)
cvopen = cv.morphologyEx(open, cv.MORPH_OPEN, kernel)
plt.imshow(cvopen)
plt.title("开运算")
plt.show()
cvclose = cv.morphologyEx(close, cv.MORPH_CLOSE, kernel)
plt.imshow(cvclose)
plt.title("闭运算")
plt.show()
top = cv.morphologyEx(open, cv.MORPH_TOPHAT, kernel)
plt.imshow(top)
plt.title("礼帽")
plt.show()
black = cv.morphologyEx(close, cv.MORPH_BLACKHAT, kernel)
plt.imshow(black)
plt.title("黑帽")
plt.show()
输出: