一、腐蚀与膨胀
腐蚀就是原图中高亮的部分被蚕食,效果图拥有比原图更小的高亮区域。
腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点。
膨胀就是使原图中高亮的部分扩张,效果图拥有比原图更大的高亮区域。
膨胀的作用是:将与物体接触的所有背景点合并到物体中,使目标增大,可填补目标中的孔洞。
OpenCv API:
cv2.erode(src, kernel, iterations) # 腐蚀
cv2.dilate(src, kernel, iterations) # 膨胀
参数:
1. img:要处理的图像
2. kernel:核结构
3. iterations:腐蚀/膨胀的次数,默认为1
原理:
(见文末)
代码编写
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\view2.jpg")
img = src.copy()
# 创建核结构
kernel = np.ones((5, 5), np.uint8)
# 腐蚀与膨胀
img_erode = cv.erode(img, kernel) # 腐蚀
img_dilate = cv.dilate(img, kernel) # 膨胀
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(img_erode[:, :, ::-1])
axes[1].set_title("绝对尺寸")
axes[2].imshow(img_dilate[:, :, ::-1])
axes[2].set_title("相对尺寸")
plt.show()
二、开闭运算
开运算是先腐蚀后膨胀,其作用是∶分离物体,消除小区域。
特点︰消除噪点,去除小的干扰块,而不影响原来的图像(消除噪声)。
闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/"闭合"物体里面的孔洞。
特点︰可以填充闭合区域(填充孔洞)。
OpenCv API:
cv2.morphologyEx(src, op, kernel)
参数:
- src:要处理的图像
- op:处理方式。若进行开运算,则为cv2.MORPH_OPEN,
若进行闭运算,则为cv2.MORPH_CLOSE - kernel:核结构
原理:
(见文末)
注意:开闭运算是不可逆的,即先开后闭并不能得到原图像
代码编写:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\01(3).png")
src2 = cv.imread("E:\\01(4).png")
img = src.copy()
img2 = src2.copy()
# 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 图像的开闭运算
img_open = cv.morphologyEx(img, cv.MORPH_OPEN, kernel) # 开运算
img2_close = cv.morphologyEx(img2, cv.MORPH_CLOSE, kernel) # 闭运算
# 显示图像
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)
axes[0][0].imshow(img[:, :, ::-1])
axes[0][0].set_title("原图1")
axes[0][1].imshow(img_open[:, :, ::-1])
axes[0][1].set_title("(原图1)开运算")
axes[1][0].imshow(img2[:, :, ::-1])
axes[1][0].set_title("原图2")
axes[1][1].imshow(img2_close[:, :, ::-1])
axes[1][1].set_title("(原图2)闭运算")
plt.show()
三、礼帽和黑帽
礼帽运算:
原图像与“开运算”结果图的差
数学表达式:dst = tophat(src,element) = src - open(src,element)
因为开运算的结果是放大了裂缝或者局部低亮度的区域,因此,原图减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域(这一操作与核的的选择有关)
礼帽运算用来分离比临近点亮一些的斑块儿,当一幅图像具有大幅背景的时候,而微小物品比较有规律的情况下可使用礼帽运算进行背景提取。
黑帽运算:
“闭运算”的结果图与原图像之差
数学表达式:dst = blackhat(src, element) = close(src, element) - src
黑帽运算的效果图突出了比原图轮廓周围的区域更暗的区域(这一操作与核的选择有关)
黑帽运算用来分离比邻近点暗一些的斑块
OpenCv API:
cv2.morphologyEx(src, op, kernel)
参数:同上
其中,
参数 | 功能 |
cv2.MORPH_OPEN | 开运算 |
cv2.MORPH_CLOSE | 闭运算 |
cv2.MORPH_TOPHAT | 礼帽运算 |
cv2.MORPH_BLACKHAT | 黑帽运算 |
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\01(3).png")
src2 = cv.imread("E:\\01(4).png")
img = src.copy()
img2 = src2.copy()
# 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 图像的礼帽与黑帽运算
img_tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
img2_blackhat = cv.morphologyEx(img2, cv.MORPH_BLACKHAT, kernel)
# 显示图像
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)
axes[0][0].imshow(img[:, :, ::-1])
axes[0][0].set_title("原图1")
axes[0][1].imshow(img_tophat[:, :, ::-1])
axes[0][1].set_title("(原图1)礼帽运算")
axes[1][0].imshow(img2[:, :, ::-1])
axes[1][0].set_title("原图2")
axes[1][1].imshow(img2_blackhat[:, :, ::-1])
axes[1][1].set_title("(原图2)黑帽运算")
plt.show()
四、总结(morphologyEX函数)
morphologyEx函数可以执行各种形态学运算。对于本文中的膨胀与腐蚀,开闭运算,礼帽与黑帽等都可以用morphologyEx函数完成。
其中,膨胀与腐蚀既可以直接用erode函数和dilate函数完成,也可以用morphologyEx函数完成(第二个参数op设置为cv2.MORPH_ERODE或者cv2.MORPH_DILATE即可),开闭运算,礼帽与黑帽都用morphologyEx函数完成。
形态学操作的原理:
1.腐蚀与膨胀
腐蚀的具体操作是∶用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做"与"操作,如果都为1,则该像素为1,否则为0。如下图所示,结构A被结构B腐蚀后∶
例如,对于结构A中的(2,4)单元格,用结构B扫描有
因为(2,4)为非高亮(即非红色),所以最终腐蚀后仍然为非高亮
例如,对于结构A中的(4,2)单元格,用结构B扫描有
因为仍有未完全覆盖的部分,所以腐蚀后(2,4)仍为非高亮
--------------------------------------------------------------------------------------------------------------------------------------
膨胀的具体操作是︰用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。如下图所示,结构A被结构B膨胀后:
原理与腐蚀类似 (只要结构B的覆盖区域中有高亮红色,则进行膨胀)
2.开闭运算
.开运算是先腐蚀后膨胀,如图所示:
闭运算是先膨胀后腐蚀,如图所示: