一、形态学操作的原理
1.腐蚀(Erosion):
将结构元素(结构元素可以类比卷积核)与图像进行逐像素的比较,只有当结构元素完全覆盖对应图像区域时,输出图像对应像素才为前景,否则为背景。腐蚀操作可以使前景区域缩小,去除细小的细节和孤立的像素。
2.膨胀(Dilation):
将结构元素(结构元素可以类比卷积核)与图像进行逐像素的比较,只要结构元素与图像有任何一个相交的像素,输出图像对应像素即为前景,否则为背景。膨胀操作可以使前景区域扩张,填充空洞和连接断裂的区域。
3.开运算(Opening):
先进行腐蚀操作,再进行膨胀操作。开运算可以消除图像中小的噪声和细小的连通区域,平滑边界并保持物体的整体形状。
4.闭运算(Closing):
先进行膨胀操作,再进行腐蚀操作。闭运算可以填充图像中的小孔和断裂,连接邻近的区域,并保持物体的整体形状。
5.梯度运算(Gradient):
通过对膨胀和腐蚀操作的结果进行差异运算,得到图像中边界的强度信息。梯度运算可以提取图像的边缘信息。
6.顶帽运算(Top Hat):
通过对原始图像与开运算结果的差异运算,得到图像中亮度较低的细节信息。顶帽运算可以突出图像中的小细节和亮度变化。
7.黑帽运算(Black Hat):
通过对闭运算结果与原始图像的差异运算,得到图像中亮度较高的细节信息。底帽运算可以突出图像中的大细节和亮度变化。
二、运用场景
1.腐蚀(Erosion):
- 去除图像中的小噪点和细小的连通区域。
- 分离接触在一起的物体。
- 缩小物体的大小。
2.膨胀(Dilation):
- 填充图像中的空洞和孔隙。
- 扩大物体的大小。
- 连接接触在一起的物体。
3.开运算(Opening):
- 去除图像中的噪点和细小的连通区域。
- 平滑物体的边界。
- 分离接触在一起的物体。
4.闭运算(Closing):
- 填充图像中的空洞和孔隙。
- 平滑物体的边界。
- 连接接触在一起的物体。
5.梯度运算(Gradient):
- 检测图像中的边缘。
- 分离物体和背景。
6.顶帽运算(Top Hat):
- 检测图像中小尺寸的明亮区域。
- 分离物体和背景。
7.黑帽运算(Black Hat):
- 检测图像中小尺寸的暗区域。
- 分离物体和背景。
三、代码演示
1.腐蚀
import cv2
import numpy as np
# 读取图像并转换为灰度图像
image = cv2.imread('image.jpg', 0)
# 定义腐蚀操作的结构元素
kernel = np.ones((5, 5), np.uint8)
# 执行腐蚀操作
erosion = cv2.erode(image, kernel, iterations=1)
# 显示结果
cv2.imshow('imge', image)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
2.膨胀
import cv2
import numpy as np
# 读取图像并转换为灰度图像
image = cv2.imread('image.jpg', 0)
# 定义膨胀操作的结构元素
kernel = np.ones((5, 5), np.uint8)
# 执行膨胀操作
dilation = cv2.dilate(image, kernel, iterations=1)
# 显示结果
cv2.imshow('imge', image)
cv2.imshow('Dilation', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
3.开运算
import cv2
import numpy as np
# 读取图像并转换为灰度图像
image = cv2.imread('image1.jpg', 0)
# 定义开运算的结构元素
kernel = np.ones((5, 5), np.uint8)
# 执行开运算
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
# 显示结果
cv2.imshow('image1', image)
cv2.imshow('Opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
4.闭运算
import cv2
import numpy as np
# 读取图像并转换为灰度图像
image = cv2.imread('image2.jpg', 0)
# 定义闭运算的结构元素
kernel = np.ones((5, 5), np.uint8)
# 执行闭运算
closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
# 显示结果
cv2.imshow('image2', image)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.梯度运算
import cv2
import numpy as np
# 读取图像并转换为灰度图像
pie=cv2.imread('ret.jpg',0)
# 定义梯度操作的结构元素
kernel = np.ones((5, 5), np.uint8)
#腐蚀膨胀
dilate=cv2.dilate(pie,kernel,iterations = 1)
erode=cv2.erode(pie,kernel,iterations = 1)
res=np.hstack((dilate,erode))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 读取图像并转换为灰度图像
# 执行梯度操作
gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel,iterations = 1)
# 显示结果
cv2.imshow('Gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
### 6.顶帽运算
import cv2
import numpy as np
# 读取图像并转换为灰度图像
image = cv2.imread('image1.jpg', 0)
# 定义顶帽操作的结构元素
kernel = np.ones((5, 5), np.uint8)
# 执行顶帽操作
tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)
# 显示结果
cv2.imshow('image1', image)
cv2.imshow('Top Hat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.黑帽运算
import cv2
import numpy as np
# 读取图像并转换为灰度图像
image = cv2.imread('image2.jpg', 0)
# 定义底帽操作的结构元素
kernel = np.ones((5, 5), np.uint8)
# 执行底帽操作
bottomhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)
# 显示结果
cv2.imshow('image2', image)
cv2.imshow('Black Hat', bottomhat)
cv2.waitKey(0)
cv2.destroyAllWindows()