当前位置: 首页 > article >正文

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

引言

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

一、图像边缘检测

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

1.边缘检测原理

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

边缘检测的主要步骤

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

常见的边缘检测算法

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

算法实现:

1.Sobel算子:
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边缘检测
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算子

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算子等多种边缘检测算法可供选择。这些算法各有优缺点,在实际应用中需要根据具体需求和图像特点选择合适的算法。


http://www.kler.cn/a/288293.html

相关文章:

  • 基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • Vue的基础使用
  • vue2使用 <component> 标签动态渲染不同的表单组件
  • DBeaver 连接 OceanBase Oracle 租户
  • 【Excel】ToRow超级查找函数
  • 执行flink sql连接clickhouse库
  • 论文《Generalized Focal Loss》阅读笔记
  • Java的内存模型(JMM)和锁机制
  • Unity (编辑器)数据持久化 之 ScriptableObject初识与创建
  • 微信小程序中Towxml解析Markdown及html
  • 【Eureka】搭建Eureka Server,实现服务注册和服务发现
  • 数据库约束--确保数据完整性
  • 用JS屏蔽网页中的鼠标点击
  • uniapp微信小程序开发测试获取手机号码
  • 研究生深度学习入门的十天学习计划------第七天
  • 【TiDB原理与实战详解】3、 集群升级和逻辑备份恢复~学不会? 不存在的!
  • Elasticsearch:使用 inference API 进行语义搜索
  • 微信小程序开发代码分包
  • redis单线程 ,当redis在执行lua脚本的时候,会执行其他redis操作吗?
  • 解决Springboot项目Maven下载依赖速度慢的问题
  • EmguCV学习笔记 C# 9.3 移动检测类
  • Vue(十二) Vuex、四个map方法的使用、Vuex模块化+namespace命名空间
  • Unity(2022.3.41LTS) - UI详细介绍-InputField(输入字段)
  • 使用golang的AST编写定制化lint
  • 小程序的页面跳转方式
  • C语言遇见的一些小问题