问题描述:
常见的7种形态学转换(腐蚀、膨胀、开运算、闭运算、形态学梯度、礼帽、黑帽)的定义是什么呢?公式是什么呢?应用场合是什么呢?
问题解答:
以下是常见的七种形态学转换的定义、公式和应用场合:
-
腐蚀 (Erosion):
- 定义: 通过用结构元素"覆盖"图像,将图像中小于结构元素的部分去除。
- 公式:
- 应用: 去除小噪声、分离连通区域。
-
膨胀 (Dilation):
- 定义: 通过用结构元素"覆盖"图像,增加图像中像素的区域。
- 公式:
- 应用: 填充小孔、连接邻近区域。
-
开运算 (Opening):
- 定义: 先腐蚀后膨胀,去除小物体而保持大物体的形状。
- 公式:
- 应用: 去除小噪声、分离重叠物体。
-
闭运算 (Closing):
- 定义: 先膨胀后腐蚀,填充小孔并连接邻近区域。
- 公式:
- 应用: 填充小孔、连接物体。
-
形态学梯度 (Morphological Gradient):
- 定义: 膨胀和腐蚀的差,突出图像的边缘。
- 公式:
- 应用: 边缘检测、形状提取。
-
礼帽 (Top Hat):
- 定义: 原图像与开运算结果的差,提取亮区域。
- 公式:
- 应用: 提取小的亮区域、背景均匀图像下的特征。
-
黑帽 (Black Hat):
- 定义: 闭运算结果与原图像的差,提取暗区域。
- 公式:
- 应用: 提取小的暗区域、分析图像的细节。
这些操作在图像处理、计算机视觉和图像分析中有广泛应用,尤其是在去噪声、形状分析和特征提取等方面。
腐蚀
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo7.jpg', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(erosion, 'gray'), plt.title('Erosion')
plt.xticks([]), plt.yticks([])
plt.show()
膨胀
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo7.jpg', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 膨胀操作
dilation = cv2.dilate(img,kernel,iterations = 1)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(dilation , 'gray'), plt.title('dilation')
plt.xticks([]), plt.yticks([])
plt.show()
开运算
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo8.png', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 开运算操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(opening , 'gray'), plt.title('opening ')
plt.xticks([]), plt.yticks([])
plt.show()
闭运算
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo9.png', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 闭运算操作
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(closing , 'gray'), plt.title('closing')
plt.xticks([]), plt.yticks([])
plt.show()
形态学梯度
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo7.jpg', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 形态学梯度操作
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(gradient , 'gray'), plt.title('gradient')
plt.xticks([]), plt.yticks([])
plt.show()
礼帽
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo8.png', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 礼帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(tophat , 'gray'), plt.title('tophat ')
plt.xticks([]), plt.yticks([])
plt.show()
黑帽
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('logo9.png', 0)
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 黑帽操作
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
# 显示图像
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(blackhat , 'gray'), plt.title('blackhat')
plt.xticks([]), plt.yticks([])
plt.show()