从零开始学cv-14:图像边缘检测

2024-09-07 21:12

本文主要是介绍从零开始学cv-14:图像边缘检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、图像边缘是什么?
  • 二、Sobel 算子
  • 三、Scharr 算子
  • 四、Prewitt算子
  • 五、Canny算子


前言

边缘检测是OpenCV中的一个重要组成部分,它用于识别图像中亮度变化显著的点,即边缘。通过边缘检测,我们可以从图像中提取出重要的特征,为后续的图像分析、形状识别和物体跟踪等任务奠定基础。
在本文中,我们将深入探讨OpenCV中的边缘检测技术,包括其基本原理、常用算法以及实际应用。我们将介绍如何使用OpenCV进行边缘检测,并提供一些示例代码,帮助读者更好地理解和掌握这一技术。


一、图像边缘是什么?

图像边缘是图像中亮度或颜色发生显著变化的区域,它们通常是图像分割和形状识别的基础。边缘检测是计算机视觉和图像处理中的一个关键步骤,用于识别图像中物体与背景之间的边界。
在数字图像中,边缘通常对应于像素值变化显著的区域。这些变化可能是由物体与背景之间的对比度差异引起的,也可能是由于物体形状或纹理的突变。边缘可以分为几种类型:

亮度边缘:这是最常见的边缘类型,它表示图像中亮度值从一个值突然变化到另一个值。
颜色边缘:在彩色图像中,颜色边缘表示颜色从一个颜色突然变化到另一个颜色。
形状边缘:这种边缘是由于物体形状的突变引起的,例如,从一个圆角变成直角。
纹理边缘:在纹理丰富的图像中,纹理边缘是由于纹理图案的突变引起的。
边缘检测算法通常使用各种技术来检测这些边缘。常用的边缘检测算子包括:

  1. Sobel算子:用于检测水平边缘和垂直边缘。
  2. Prewitt算子:类似于Sobel算子,用于检测水平边缘和垂直边缘。
  3. Roberts算子:用于检测水平和垂直边缘。
  4. Canny边缘检测器:这是一个更复杂的边缘检测算法,它能够检测到图像中的所有边缘,并抑制噪声。
    在计算机视觉和图像处理中,边缘检测的结果通常用于进一步的图像分析,如轮廓检测、形状识别、图像分割和目标跟踪等。通过提取边缘信息,我们可以更好地理解图像内容,并将其应用于各种实际应用中,下面我们来学习一些常用的边缘检测方法。

二、Sobel 算子

Sobel算子是一种用于边缘检测的算法,它在图像处理中非常常见。它通过计算图像亮度的空间梯度来突出显示图像中的边缘。Sobel算子包含两个核(即卷积矩阵),分别用于检测图像的水平边缘和垂直边缘。
图像的边缘通常对应于梯度的极大值,因此通过计算图像的梯度,我们可以检测到图像中的边缘。Sobel算子通过使用两个3x3的卷积核来近似计算图像的水平和垂直梯度。这两个核分别对图像进行卷积操作,以产生两个梯度分量。
PS:在数学中,梯度是一个向量,表示函数在某一点处的最大变化率。在二维图像中,梯度可以表示为亮度的变化率,并且可以用两个分量来描述:水平方向的变化率(梯度x)和垂直方向的变化率(梯度y)。

Sobel算子通过使用两个3x3的卷积核来近似计算图像的水平和垂直梯度。这两个核分别对图像进行卷积操作,以产生两个梯度分量。在这里插入图片描述
将这两个核分别与图像进行卷积,可以得到两个梯度分量 Gx和 Gy 。然后,可以使用以下公式计算梯度的幅度
在这里插入图片描述
梯度方向 θ 可以通过以下公式计算:
在这里插入图片描述
在OpenCV库中,Sobel函数是一个用于计算图像亮度的空间梯度的函数,它可以用来检测图像中的边缘。dst = cv2.Sobel(src, ddepth, dx, dy, ksize[, scale[, delta[, borderType]]])

src: 输入图像,可以是灰度图像或者彩色图像。如果是彩色图像,Sobel函数会在每个颜色通道上单独计算梯度。
ddepth: 目标图像的所需深度,以下是几个常用的选项:
cv2.CV_8U: 8位无符号整数
cv2.CV_16U: 16位无符号整数
cv2.CV_32F: 32位浮点数
cv2.CV_64F: 64位浮点数 通常使用cv2.CV_64F以避免在计算过程中出现数据溢出。
dx: x方向的差分阶数,取值1或0。1表示计算水平方向的梯度。
dy: y方向的差分阶数,取值1或0。1表示计算垂直方向的梯度。
ksize: Sobel核的大小,必须是正数和奇数,常见的取值为1、3、5或7。如果ksize=-1,则使用3x3的Scharr算子。
scale: 可选参数,用于缩放结果,默认值为1。
delta: 可选参数,用于在结果中添加一个可选的增量值,默认值为0。
borderType: 边界类型,用于处理图像边界,默认值为cv2.BORDER_DEFAULT。

代码:

import cv2imgGray = cv2.resize(cv2.imread(r"E:\PS\R-C.jpg", flags=0), (640,480)) # flags=0 灰度图像x = cv2.Sobel(imgGray,-1, 1,0)  # -1代表输入输出同深度 1 0 代表x方向
y = cv2.Sobel(imgGray, -1, 0,1) # -1代表输入输出同深度 0 1 代表y方向
cv2.imshow("dx",x)
cv2.imshow("dy",y)
cv2.waitKey(0)

效果:
在这里插入图片描述

三、Scharr 算子

Sobel算子虽然能有效提取图像边缘,但对于图像中较弱的边缘,其提取效果往往不尽人意。为了更有效地揭示这些细微边缘,需要提升像素值间的对比度,这就引入了Scharr算子。Scharr算子实际上是Sobel算子的一个改进版本,旨在增强其差异性,因此它们在边缘检测的原理和操作方式上是相通的。Scharr算子的边缘检测滤波器尺寸同样为3×3,因而有时也被称为Scharr滤波器。它通过增大滤波器中权重系数,从而放大像素值间的差异,实现了对较弱边缘的更有效提取。以下是Scharr算子在X方向和Y方向的边缘检测算子的示意图。
在这里插入图片描述
在opencv中的实现是cv2.Scharr( src, ddepth, dx, dy, scale, delta, borderType)

src: 输入图像,通常是灰度图像。
ddepth: 输出图像的深度,见 cv2.Sobel() 的说明,通常使用 cv2.CV_64F 以避免数据截断。
dx: X方向上的导数阶数,取值1或0。1表示计算水平方向的边缘。
dy: Y方向上的导数阶数,取值1或0。1表示计算垂直方向的边缘。
scale: 可选参数,用于缩放结果,默认值为1。
delta: 可选参数,用于在结果中添加一个可选的增量值,默认值为0。
borderType: 边界类型,用于处理图像边界,默认值为 cv2.BORDER_DEFAULT。

效果:
在这里插入图片描述

四、Prewitt算子

Prewitt算子是图像处理中用于边缘检测的一种算子,与Sobel算子类似,它也是通过计算图像亮度的空间梯度来检测边缘。Prewitt算子使用两个卷积核分别对图像进行卷积操作,以计算水平和垂直方向的梯度。
Prewitt算子与Sobel算子均为边缘检测中常用的梯度算子,然而它们采用的卷积核并不相同。Prewitt算子的卷积核具有较为均匀的权重分布,而Sobel算子的中心位置权重更高,这使得Sobel算子在边缘定位上更为精确。 在检测水平与垂直边缘方面,Prewitt算子展现出对称性,而Sobel算子由于其中心权重的差异,对水平与垂直边缘的检测呈现出一定的偏向性。 在某些特定的情境下,Prewitt算子能描绘出更细腻的边缘细节,这是因为它对各个方向的边缘赋予了同等的权重。
水平梯度:
在这里插入图片描述
垂直梯度:
在这里插入图片描述
代码实现:

import cv2
import numpy as np# 读取图像
image = cv2.imread('D:\AI_tool\GFPGAN-master\shenshoushoushitupiansucai_3889318.jpg', cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image,(0,0),fx=0.5,fy=0.5)
# 定义Prewitt算子的卷积核
prewitt_x = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=np.float32)
prewitt_y = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)# 使用filter2D函数应用Prewitt算子
G_x = cv2.filter2D(image, -1, prewitt_x)
G_y = cv2.filter2D(image, -1, prewitt_y)# 计算梯度幅度
G = np.sqrt(G_x**2 + G_y**2)# 将梯度幅度转换为8位整数以进行显示
G = np.uint8(G)_, thresholded = cv2.threshold(G, 10, 255, cv2.THRESH_BINARY)# 显示图像
cv2.imshow('ori', image)
cv2.imshow('Thresholded Edge Detection', thresholded)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:在这里插入图片描述

五、Canny算子

Canny边缘检测算法,由John F. Canny于1986年提出,旨在实现一种高效的边缘检测技术,适用于图像处理领域。该算法旨在在减少噪声干扰的同时,精确地识别图像中的边缘。Canny算法的特点包括高检测率、低误报率和低信噪比,这些特点使得它能够有效地检测到图像中的真实边缘,同时抑制噪声和假边缘的产生。

Canny算法的具体步骤如下:

高斯滤波:首先,使用高斯滤波器对图像进行平滑处理,以降低噪声的影响。
计算梯度:接着,使用Sobel算子或其他梯度计算方法计算图像的梯度,梯度的大小表示边缘的强度,方向表示边缘的方向。
非极大值抑制:在梯度图像上应用非极大值抑制,以保留边缘的方向信息,并去除噪声点。这一步骤有助于增强边缘的显著性。
双阈值处理:选择两个阈值,一个较低的阈值和一个较高的阈值。只有当一个像素的梯度值在两个阈值之间时,它才被认为是边缘。这一步骤有助于区分真正的边缘和噪声。
边缘跟踪:使用双阈值处理后的图像来跟踪边缘。在跟踪过程中,如果一个像素的梯度值高于高阈值,则将其视为边缘;如果像素值在两个阈值之间,则将其视为可能的边缘;如果像素值低于低阈值,则不考虑。这一步骤有助于精确地定位边缘的位置。其opencv的api为edges = cv2.Canny(image, lowThreshold, highThreshold)

image: 输入图像,通常是灰度图像。
lowThreshold: 较低的阈值,用于确定边缘的候选点。
highThreshold: 较高的阈值,用于确定边缘的准确位置。

使用代码:

import cv2
import numpy as np# 读取图像
image = cv2.resize(cv2.imread(r'D:\AI_tool\GFPGAN-master\shenshoushoushitupiansucai_3889318.jpg', cv2.IMREAD_GRAYSCALE),(0,0),fx=0.5,fy=0.5)# 应用Canny边缘检测
low_threshold = 50
high_threshold = 50
edges = cv2.Canny(image, low_threshold, high_threshold)# 显示图像
cv2.imshow('Original Image', image)
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:
在这里插入图片描述

这篇关于从零开始学cv-14:图像边缘检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146170

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

BIRT--商业智能和报表工具,从零开始

1.简介 BIRT (Business Intelligence and Reporting Tools), 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统,特别之处在于它是以 Java 和 JavaEE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。 2.下载 官网下载网址:http://download.ec