opencv图像形态学(边缘检测算法实例)

引言

图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。在OpenCV中,图像形态学操作通过一系列的数学运算来实现,如腐蚀、膨胀、开运算、闭运算等。这些操作在图像处理、计算机视觉和模式识别等领域有着广泛的应用。

一、图像边缘检测

边缘检测:是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域

1.边缘检测原理

边缘检测的基本原理是基于图像中局部区域与周围区域之间的灰度变化。当图像中存在灰度变化时,这种变化通常被视为边缘。在实际应用中,梯度可以通过不同的算法来计算,如Sobel算子、Prewitt算子等。这些算法通过应用特定的卷积核(或模板)到图像上,来计算每个像素点的梯度。

边缘检测的主要步骤

  1. 滤波:由于边缘检测算法主要基于图像强度的一阶和二阶导数,但这些导数对噪声非常敏感,因此滤波是边缘检测前的必要步骤。常用的滤波器是高斯滤波器,它通过离散化的高斯函数产生一组归一化的高斯核,然后基于这些高斯核对图像灰度矩阵的每一点进行加权求和,从而实现图像的平滑处理。
  2. 增强:增强算法的目的是将图像中灰度有显著变化的点(即潜在的边缘点)凸显出来。一般通过计算梯度幅值来完成。梯度是一个向量,表示图像中亮度变化的方向和速率。梯度的幅值反映了亮度变化的强度,因此可以通过计算每个像素点的梯度幅值来增强边缘信息。
  3. 检测:在增强后的图像中,虽然边缘信息得到了凸显,但并非所有梯度幅值较大的点都是真正的边缘点。因此,需要通过阈值化来检测边缘点。即设定一个或多个阈值,将梯度幅值大于阈值的点视为边缘点。
  4. 定位与连接:在检测到边缘点后,需要进一步确定边缘的精确位置,并将检测到的边缘点连接成完整的边缘轮廓。这通常涉及到对边缘点的进一步处理和分析,如亚像素边缘定位、霍夫变换、轮廓跟踪等。

常见的边缘检测算法

  1. Sobel算子:Sobel算子是基于一阶导数的边缘检测算子,它利用像素上下左右邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。Sobel算子有两个,一个是检测水平边缘的,另一个是检测垂直边缘的。
  2. Laplacian算子:Laplacian算子是基于二阶导数的边缘检测算子,它对噪声比较敏感,但能够检测到更细致的边缘。Laplacian算子可以检测两个方向上的边,但通常需要先对图像进行平滑处理以减少噪声的影响。
  3. Canny边缘检测:Canny边缘检测是一种多级边缘检测算法,它结合了高斯滤波、梯度计算、非极大值抑制和双阈值处理等多个步骤,能够以较低的错误率检测边缘,并且检测到的边缘精确定位在真实边缘的中心。Canny边缘检测算法是目前应用最广泛的边缘检测算法之一。

算法实现:

1.Sobel算子:
python 复制代码
import cv2  
  
# 读取图片
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)  
  
# 使用Sobel算子检测x方向的边缘,结果以64位浮点数存储  
monkey_x_64 = cv2.Sobel(monkey, cv2.CV_64F, dx=1, dy=0)  
  
# 将64位浮点数结果转换为8位无符号整数,便于显示  
monkey_x_full = cv2.convertScaleAbs(monkey_x_64)  
  
# 使用Sobel算子检测y方向的边缘,结果以64位浮点数存储  
monkey_y_64 = cv2.Sobel(monkey, cv2.CV_64F, dx=0, dy=1)  
  
# 将64位浮点数结果转换为8位无符号整数,便于显示  
monkey_y_full = cv2.convertScaleAbs(monkey_y_64)  
  
# 将x和y方向的边缘图像加权合并  
monkey_xy_full = cv2.addWeighted(monkey_x_full, 0.5, monkey_y_full, 0.5, 0)  # 这里我调整了权重为0.5和0.5,您可以根据需要调整  
  
# 显示合并后的边缘图像  
cv2.imshow("monkey_xy", monkey_xy_full)  
  
# 等待按键操作  
cv2.waitKey(0)  
  
# 关闭所有OpenCV窗口  
cv2.destroyAllWindows()

前后对比

2.Canny边缘检测
python 复制代码
import cv2  
  
# 读取图片,注意文件名更正为 monkey.jpg  
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)  
  
# 显示原始灰度图片  
cv2.imshow('Original Monkey', monkey)  
cv2.waitKey(0)  
  

# 使用Canny边缘检测算法  
monkey_canny = cv2.Canny(monkey, 50, 100)  
  
# 显示Canny边缘检测结果,注意窗口命名以避免混淆  
cv2.imshow('Canny Edges', monkey_canny)  
cv2.waitKey(0)  
  
# 关闭所有OpenCV窗口  
cv2.destroyAllWindows()

前后对比

3.Laplacian算子
python 复制代码
import cv2  
  
# 读取图片,注意文件名更正为 monkey.jpg  
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)  

# 应用Laplacian算子检测边缘  
monkey_lap = cv2.Laplacian(monkey, cv2.CV_64F)  
monkey_lap_full = cv2.convertScaleAbs(monkey_lap)  
  
# 显示Laplacian边缘检测结果  
cv2.imshow('Laplacian Edges', monkey_lap_full)  
cv2.waitKey(0) 

除了上述算法外,还有Prewitt算子、Roberts算子、Scharr算子等多种边缘检测算法可供选择。这些算法各有优缺点,在实际应用中需要根据具体需求和图像特点选择合适的算法。

相关推荐
珠海新立电子科技有限公司2 小时前
FPC柔性线路板与智能生活的融合
人工智能·生活·制造
IT古董2 小时前
【机器学习】机器学习中用到的高等数学知识-8. 图论 (Graph Theory)
人工智能·机器学习·图论
曼城周杰伦2 小时前
自然语言处理:第六十三章 阿里Qwen2 & 2.5系列
人工智能·阿里云·语言模型·自然语言处理·chatgpt·nlp·gpt-3
余炜yw3 小时前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
莫叫石榴姐3 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
弗锐土豆4 小时前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
如若1234 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib
YRr YRr4 小时前
深度学习:神经网络中的损失函数的使用
人工智能·深度学习·神经网络
ChaseDreamRunner4 小时前
迁移学习理论与应用
人工智能·机器学习·迁移学习
Guofu_Liao4 小时前
大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法
人工智能·语言模型·矩阵·llama