opencv学习:形态学操作和边缘检测算子

cv2.morphologyEx() 是 OpenCV 库中的一个函数,用于执行更复杂的形态学操作。这个函数可以执行开运算、闭运算、梯度运算、膨胀、腐蚀以及顶帽和黑帽转换等。这些操作通常用于图像预处理,如去除噪声、平滑边界、突出特征等。

python 复制代码
dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数说明:

  • src:输入图像,可以是灰度图像或彩色图像。
  • op:指定要执行的形态学操作类型,可以是以下值之一:
    • cv2.MORPH_ERODE:腐蚀操作
    • cv2.MORPH_DILATE:膨胀操作
    • cv2.MORPH_OPEN:开运算(先腐蚀后膨胀)
    • cv2.MORPH_CLOSE:闭运算(先膨胀后腐蚀)
    • cv2.MORPH_GRADIENT:梯度运算(膨胀图像减去腐蚀图像)
    • cv2.MORPH_TOPHAT:顶帽运算(原图像减去开运算图像)
    • cv2.MORPH_BLACKHAT:黑帽运算(闭运算图像减去原图像)
  • kernel:结构元素,用于定义操作的尺寸和形状。
  • dst:输出图像,与输入图像具有相同的大小和类型。
  • anchor:结构元素的锚点(默认为 (-1, -1),即结构元素的中心)。
  • iterations:操作的迭代次数(默认为 1)。
  • borderType:边界像素的填充方式(默认为 cv2.BORDER_CONSTANT)。
  • borderValue:用于边界填充的值(默认为 0)

膨胀操作

python 复制代码
wenzi = cv2.imread("4.png")
kernel = np.ones((2,2), np.uint8)# 创建一个2x2的结构元素
# 对图像进行膨胀操作,可以增大图像中的亮区域
pz_wenzi = cv2.dilate(wenzi, kernel, iterations=2)
cv2.imshow("pz_wenzi", pz_wenzi)

腐蚀操作

python 复制代码
# 对图像进行腐蚀操作,可以减小图像中的亮区域
fs_wenzi = cv2.erode(wenzi, kernel, iterations=2)
cv2.imshow("fs_wenzi", fs_wenzi)

开运算

python 复制代码
sun = cv2.imread("3.png")
kernel = np.ones((2,2), np.uint8)# 创建一个2x2的结构元素
# 对图像进行开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow("opensun", open_sun)

闭运算

python 复制代码
# 对图像进行闭运算,可以填充小的空洞
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow("close_sun", close_sun)

梯度操作

python 复制代码
# 对图像进行梯度操作,可以突出图像中的边缘
bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("bianyuan", bianyuan)

顶帽操作

python 复制代码
# 对图像进行顶帽操作,可以突出比邻近区域亮的区域
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow("tophat", tophat)

黑帽操作

python 复制代码
# 执行黑帽运算
blackhat_image = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('Black Hat Image', blackhat_image)

在图像处理中,Sobel、Scharr 、 Laplacian和Canny 算子都是用于边缘检测的算法。它们通过计算图像的梯度来识别图像中的边缘。下面是每种算子的简要说明:

Sobel 算子

Sobel 算子是一种用于边缘检测的离散微分算子。它结合了高斯平滑和微分求导,用于计算图像亮度的空间梯度,从而突出图像的边缘。

  • 优点:对噪声不太敏感,因为它结合了平滑和微分。
  • 缺点:可能会产生不精确的边缘定位。
python 复制代码
# 使用 Sobel 算子计算 x 方向的梯度
yuan_x = cv2.Sobel(yuan, -1, dx=1, dy=0)
# 显示 x 方向的梯度图像
cv2.imshow('yuan_x', yuan_x)

# 使用 Sobel 算子计算 x 方向的梯度(64位浮点数)
yuan_x_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=1, dy=0)
# 显示 64位浮点数的 x 方向梯度图像
cv2.imshow('yuan_x_64', yuan_x_64)
# 转换为 8 位无符号整数并显示
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full', yuan_x_full)

# 使用 Sobel 算子计算 y 方向的梯度
yuan_y = cv2.Sobel(yuan, -1, dx=0, dy=1)
# 显示 y 方向的梯度图像
cv2.imshow('yuan_y', yuan_y)

# 使用 Sobel 算子计算 y 方向的梯度(64位浮点数)
yuan_y_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=0, dy=1)
# 显示 64位浮点数的 y 方向梯度图像
cv2.imshow('yuan_y_64', yuan_y_64)
# 转换为 8 位无符号整数并显示
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y_full', yuan_y_full)

# 将 x 和 y 方向的梯度图像合并显示
yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 0)
cv2.imshow('yuan_xy_full', yuan_xy_full)

Scharr 算子

Scharr 算子是 Sobel 算子的改进版,它提供了更好的近似。Scharr 算子使用更精确的滤波器系数来计算梯度,因此通常会产生更准确的边缘定位。

  • 优点:比 Sobel 算子更精确,因为它使用更精确的滤波器。
  • 缺点:计算量略大,因为它使用更大的核。
python 复制代码
# 使用 Scharr 算子计算 x 方向的梯度(64位浮点数)
yuan_x_64 = cv2.Scharr(yuan, cv2.CV_64F, dx=1, dy=0)
# 转换为 8 位无符号整数并显示
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
# 注意:这里覆盖了之前显示的 'yuan_x_full' 图像
cv2.imshow('yuan_x_full', yuan_x_full)

# 使用 Scharr 算子计算 y 方向的梯度(64位浮点数)
yuan_y_64 = cv2.Scharr(yuan, cv2.CV_64F, dx=0, dy=1)
# 转换为 8 位无符号整数并显示
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
# 注意:这里覆盖了之前显示的 'yuan_y_full' 图像
cv2.imshow('yuan_y_full', yuan_y_full)
# 将 Scharr 算子计算的 x 和 y 方向的梯度图像合并显示
yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 0)
cv2.imshow('yuan_xy_full', yuan_xy_full)

Laplacian 算子

Laplacian 算子是一种二阶导数算子,用于检测图像中的边缘。它通过计算图像亮度的二阶导数来工作,可以识别图像中的区域,其中亮度有显著变化。

  • 优点:可以检测所有方向的边缘,并且对图像中的噪声不太敏感。
  • 缺点:可能会产生多个响应,包括非边缘区域,因为它对二阶导数的零交叉点敏感。
python 复制代码
# 读取车牌图像
zl = cv2.imread('che.png', cv2.IMREAD_GRAYSCALE)

# 使用 Laplacian 算子进行边缘检测
zl_lap = cv2.Laplacian(zl, cv2.CV_64F)
# 转换为 8 位无符号整数并显示
zl_lap_full = cv2.convertScaleAbs(zl_lap)
cv2.imshow('zl_lap_full', zl_lap_full)

Canny 算子

Canny 算子是一种多阶段算法,用于边缘检测,被认为是最优化的边缘检测算法之一。它包括噪声降低、计算梯度、非极大值抑制、双阈值检测和边缘跟踪等步骤。

  • 优点:提供了很好的边缘检测性能,能够准确地检测到边缘并最小化响应错误。
  • 缺点:算法相对复杂,计算量较大。
python 复制代码
zl_canny=cv2.Canny(zl,700,500)
cv2.imshow('zl_canny',zl_canny)
相关推荐
sp_fyf_20241 小时前
【大语言模型】ACL2024论文-35 WAV2GLOSS:从语音生成插值注解文本
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·数据挖掘
AITIME论道1 小时前
论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
人工智能·深度学习·学习·机器学习·语言模型
明明真系叻2 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
88号技师3 小时前
2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
人工智能·算法·matlab·优化算法
IT猿手3 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
青春男大3 小时前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
88号技师3 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
2301_764441333 小时前
基于python语音启动电脑应用程序
人工智能·语音识别
HyperAI超神经4 小时前
未来具身智能的触觉革命!TactEdge传感器让机器人具备精细触觉感知,实现织物缺陷检测、灵巧操作控制
人工智能·深度学习·机器人·触觉传感器·中国地质大学·机器人智能感知·具身触觉
galileo20164 小时前
转化为MarkDown
人工智能