一、形态学基本操作
- 形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征,以便进行图像分析和目标识别。
形态学操作都是基于各种形状的结构元,结构元对输入图像进行操作得到输出图像。
二、形态学梯度
-
图像的形态学梯度运算,是膨胀图像与腐蚀图像之差 ,可以得到图像的轮廓,通常用于提取物体边缘。
-
结构元 B 对集合 A 的形态学梯度运算定义为:
闭运算通过填充图像的凹角来实现图像滤波,结构元大小的不同将导致滤波效果的不同,不同结构元素的选择导致不同的分割。
三、函数
- OpenCV 中的函数 cv.morphologyEx 可以实现形态学梯度运算,但要将参数 op 设为 MORPH_GRADIENT。
cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )→ dst
函数 cv.morphologyEx 使用侵蚀(erosion)和膨胀(dilation)作为基本操作来执行高级形态转换。
四、例程
- 10.7:图像的形态学梯度
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 10.7 图像的形态学梯度运算 (cv.morphologyEx)
# 读取原始图像
imgGray = cv2.imread(r"E:/OpenCV/Fig0905a.tif", flags=0) # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 15, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化处理
# 图像的形态学梯度
kSize = (3, 3) # 卷积核的尺寸
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核
imgGrad1 = cv2.morphologyEx(imgBin, cv2.MORPH_GRADIENT, kernel) # 形态学梯度
kSize = (5, 5) # 卷积核的尺寸
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核
imgGrad2 = cv2.morphologyEx(imgBin, cv2.MORPH_GRADIENT, kernel) # 形态学梯度
kSize = (3, 3) # 卷积核的尺寸
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核
imgOpen = cv2.morphologyEx(imgBin, cv2.MORPH_OPEN, kernel) # 开运算
imgOpenGrad = cv2.morphologyEx(imgOpen, cv2.MORPH_GRADIENT, kernel) # 形态学梯度
plt.figure(figsize=(10, 5))
plt.subplot(141), plt.axis('off'), plt.title("Origin")
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(142), plt.title("Gradient (size=3)"), plt.axis('off')
plt.imshow(imgGrad1, cmap='gray', vmin=0, vmax=255)
plt.subplot(143), plt.title("Gradient (size=5)"), plt.axis('off')
plt.imshow(imgGrad2, cmap='gray', vmin=0, vmax=255)
plt.subplot(144), plt.title("Opening -> Gradient"), plt.axis('off')
plt.imshow(imgOpenGrad, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
五、资料
youcans_的博客:
https://blog.csdn.net/youcans/article/details/123344496










网友评论