(计算机视觉课程-笔记1)图像边缘检测

这篇具有很好参考价值的文章主要介绍了(计算机视觉课程-笔记1)图像边缘检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像边缘检测

1. sobel 算子

Sobel算子是一种常用于图像处理和计算机视觉中的边缘检测算法。它用于识别图像中的边缘区域,即图像中灰度值发生剧烈变化的地方。Sobel算子基于图像的灰度梯度,通过计算每个像素点周围像素的灰度值差异,来确定边缘的位置和方向。

Sobel算子主要由两个3x3的矩阵组成,分别用于计算图像在水平和垂直方向的梯度。这两个矩阵通常被称为Sobel算子模板或卷积核。下面是水平和垂直方向的Sobel算子模板示例:

水平方向Sobel算子模板(Gx):

-1  0  1
-2  0  2
-1  0  1

垂直方向Sobel算子模板(Gy):

-1 -2 -1
 0  0  0
 1  2  1

Sobel算子的计算过程如下:

首先,将Sobel算子模板与图像的每个像素进行卷积操作。对于每个像素,将其与周围的8个像素进行乘法运算,然后将乘积相加得到一个结果。

对于水平方向的Sobel算子,将像素与模板进行乘法运算后相加的结果表示图像在水平方向上的梯度。

对于垂直方向的Sobel算子,将像素与模板进行乘法运算后相加的结果表示图像在垂直方向上的梯度。

在水平和垂直方向上的梯度计算完成后,可以通过以下公式来计算图像中每个像素的梯度幅值和梯度方向:

梯度幅值(G):G = sqrt(Gx^2 + Gy^2)
梯度方向(θ):θ = atan2(Gy, Gx)
最后,可以根据梯度幅值进行边缘检测。一般来说,梯度幅值越大的像素点,很可能是图像中的边缘点。

Sobel算子是一种简单而有效的边缘检测算法,常用于图像处理任务中。它可以帮助我们在图像中找到边缘信息,并在计算机视觉领域中的对象检测、图像分割等任务中发挥重要作用。

1. 2sobel 算子(cv2实现)

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 计算水平方向和垂直方向上的Sobel梯度
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

# 将梯度值转换为绝对值
sobel_x = np.absolute(sobel_x)
sobel_y = np.absolute(sobel_y)

# 将梯度值缩放到0-255范围内
sobel_x = np.uint8(sobel_x)
sobel_y = np.uint8(sobel_y)

# 将水平和垂直方向上的梯度值合并
sobel_combined = cv2.bitwise_or(sobel_x, sobel_y)

# 显示原始图像和Sobel边缘检测结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 函数cv2.Sobel()用于计算图像的Sobel梯度。下面是该函数的参数及其含义的解释:

# image:输入图像。这应该是一个单通道灰度图像(如使用参数cv2.IMREAD_GRAYSCALE加载的图像),或者可以是多通道图像,其中仅考虑一个通道进行边缘检测。

# cv2.CV_64F:输出图像的数据类型。这里我们使用cv2.CV_64F表示64位浮点型数据,以便在计算梯度时能够保留负数值。

# 1:x方向上的差分阶数。这指定了在x方向上计算梯度时使用的差分阶数,设置为1表示使用一阶导数。

# 0:y方向上的差分阶数。这指定了在y方向上计算梯度时使用的差分阶数,设置为0表示不在y方向上计算梯度。

# ksize=3:Sobel算子的卷积核大小。它定义了在计算梯度时要使用的卷积核的大小。在这种情况下,ksize=3表示使用一个3x3的卷积核。

# 请注意,Sobel算子可以在x方向和y方向上分别计算梯度,通过使用不同的差分阶数来指定。在上述示例中,我们选择在x方向上计算一阶导数(水平方向)
# ,而在y方向上不计算梯度。这是因为Sobel算子通常用于检测图像中的水平边缘。如果您希望检测垂直边缘,可以将x和y方向的差分阶数进行交换。

2. Prewitt算子

Prewitt算子是一种常用于图像处理和计算机视觉中的边缘检测算法,类似于Sobel算子。它也用于检测图像中的边缘区域,即图像中灰度值发生剧烈变化的地方。Prewitt算子基于图像的灰度梯度,通过计算每个像素点周围像素的灰度值差异来确定边缘的位置和方向。

Prewitt算子与Sobel算子类似,都使用两个3x3的矩阵来计算图像的梯度。下面是水平和垂直方向的Prewitt算子模板示例:

水平方向Prewitt算子模板(Gx):

-1  0  1
-1  0  1
-1  0  1

垂直方向Prewitt算子模板(Gy):

-1 -1 -1
 0  0  0
 1  1  1

Prewitt算子的计算过程与Sobel算子类似:

首先,将Prewitt算子模板与图像的每个像素进行卷积操作。对于每个像素,将其与周围的8个像素进行乘法运算,然后将乘积相加得到一个结果。

对于水平方向的Prewitt算子,将像素与模板进行乘法运算后相加的结果表示图像在水平方向上的梯度。

对于垂直方向的Prewitt算子,将像素与模板进行乘法运算后相加的结果表示图像在垂直方向上的梯度。

可以通过以下公式计算图像中每个像素的梯度幅值和梯度方向:

梯度幅值(G):G = sqrt(Gx^2 + Gy^2)
梯度方向(θ):θ = atan2(Gy, Gx)
最后,可以根据梯度幅值进行边缘检测。梯度幅值较大的像素点可能表示图像中的边缘点。

Prewitt算子与Sobel算子相比,差别较小。它们的模板略有不同,因此在某些情况下,Prewitt算子可能产生略微不同的边缘检测结果。在实际应用中,您可以根据任务的要求选择使用Sobel算子还是Prewitt算子。

2.2 Prewitt算子(cv2实现)

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 构建Prewitt算子的卷积核
kernel_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)
kernel_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float32)

# 使用filter2D函数进行卷积运算
prewitt_x = cv2.filter2D(image, -1, kernel_x)
prewitt_y = cv2.filter2D(image, -1, kernel_y)

# 将梯度值转换为绝对值
prewitt_x = np.absolute(prewitt_x)
prewitt_y = np.absolute(prewitt_y)

# 将梯度值缩放到0-255范围内
prewitt_x = np.uint8(prewitt_x)
prewitt_y = np.uint8(prewitt_y)

# 将水平和垂直方向上的梯度值合并
prewitt_combined = cv2.bitwise_or(prewitt_x, prewitt_y)

# 显示原始图像和Prewitt边缘检测结果
cv2.imshow('Original Image', image)
cv2.imshow('Prewitt X', prewitt_x)
cv2.imshow('Prewitt Y', prewitt_y)
cv2.imshow('Prewitt Combined', prewitt_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3 Prewitt算子与sobel算子对比

Sobel算子和Prewitt算子是两种常用的边缘检测算子,它们在计算边缘梯度时略有不同。下面是Sobel算子和Prewitt算子之间的主要差别:
1 模板差异:
Sobel算子的水平方向和垂直方向的模板分别为:

Gx = [[-1, 0, 1],
      [-2, 0, 2],
      [-1, 0, 1]]
      
Gy = [[-1, -2, -1],
      [ 0,  0,  0],
      [ 1,  2,  1]]

Prewitt算子的水平方向和垂直方向的模板分别为:

Gx = [[-1, 0, 1],
      [-1, 0, 1],
      [-1, 0, 1]]
      
Gy = [[-1, -1, -1],
      [ 0,  0,  0],
      [ 1,  1,  1]]

2 灵敏度差异:
Sobel算子的模板在中心位置权重较大,因此对中心像素的梯度响应更为敏感。
Prewitt算子的模板在水平和垂直方向上的权重相等,对中心像素和周围像素的梯度响应相对均衡。
3 梯度估计:
由于Sobel算子的模板权重较大,它更适合在边缘具有较高对比度的图像中进行梯度估计。
Prewitt算子在边缘具有较弱对比度的图像中也能提供较好的梯度估计。
4 计算效率:
由于Sobel算子的模板中存在更多非零权重,计算Sobel算子的梯度可能稍微更为耗时。
Prewitt算子的模板中非零权重较少,计算Prewitt算子的梯度相对较快。

3. canny算子

Canny算子是一种常用的边缘检测算法,由John F. Canny于1986年提出。它被广泛应用于计算机视觉和图像处理领域,用于检测图像中的边缘。Canny算子在边缘检测中具有较高的准确性和良好的噪声抑制能力。

Canny算子的边缘检测过程包括以下几个步骤:

1:噪声抑制: 首先,对输入图像进行高斯滤波以减少噪声的影响。高斯滤波平滑图像,通过计算每个像素周围邻域内像素的加权平均值来达到这一目的。

2:梯度计算: 然后,使用Sobel算子计算图像的梯度。Sobel算子分别在水平和垂直方向上对图像进行卷积操作,得到每个像素点的梯度强度和梯度方向。

3:非极大值抑制: 接下来,执行非极大值抑制来细化边缘。对于每个像素点,根据其梯度方向,检查它是否为该方向上局部梯度的极大值。如果不是极大值,则被抑制。

4:双阈值处理: 通过双阈值处理来确定真正的边缘。设置两个阈值:低阈值和高阈值。根据像素的梯度强度,将像素分为强边缘、弱边缘和非边缘三类。只有当像素的梯度强度超过高阈值时,才被认为是强边缘。如果像素的梯度强度低于低阈值,则被视为非边缘。位于两个阈值之间的像素被认为是弱边缘。可以选择执行边缘连接来连接强边缘与与之相邻的弱边缘。

5:边缘连接: 可选的边缘连接步骤可以通过将弱边缘与相邻的强边缘连接起来,从而形成完整的边缘。这可以通过在弱边缘的邻域内查找强边缘来实现。

Canny算子的输出结果是二进制图像,其中边缘像素被标记为白色(255),非边缘像素被标记为黑色(0)。

3.2 非极大值抑制

非极大值抑制(Non-Maximum Suppression,简称NMS)是Canny边缘检测算法中的一个重要步骤,用于细化边缘并保留边缘的细节信息。该步骤通过在梯度方向上进行比较,仅保留局部梯度的极大值,将非极大值抑制。

以下是非极大值抑制的详细步骤:

梯度计算: 首先,在Canny算子的边缘检测过程中,通过应用Sobel算子计算图像的梯度。这会得到每个像素点的梯度强度(Gradient Magnitude)和梯度方向(Gradient Direction)。

梯度方向量化: 将梯度方向量化为四个主要方向之一:0°(垂直)、45°(对角线)、90°(水平)和135°(对角线)。这样可以将梯度方向划分为四个离散的方向。

非极大值抑制: 对于每个像素点,沿着梯度方向的正负两个方向上比较其梯度强度。如果该像素点的梯度强度大于其两侧的像素点(在梯度方向上)的梯度强度,则保留该像素点。否则,将其抑制为非边缘点。

具体步骤如下:

对于每个像素点P,找到其相邻的两个像素点(在梯度方向上),即正方向像素点和负方向像素点。
检查像素点P的梯度强度是否大于这两个相邻像素点的梯度强度。如果是,则保留像素点P为边缘点。否则,将像素点P抑制为非边缘点。
这个过程将会细化边缘,并保留了局部梯度的极大值,去除了不符合极大值条件的非边缘像素。

非极大值抑制的结果是一个二值图像,其中只有边缘像素被标记为白色(255),非边缘像素被标记为黑色(0)。

通过应用非极大值抑制,Canny算子可以在梯度方向上细化边缘,使其变得更细,并保留了边缘的细节信息。这一步骤对于提高边缘检测的准确性和保留重要边缘特征至关重要。

3.3canny算子cv代码

import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 高斯滤波
blurred = cv2.GaussianBlur(image, (5, 5), 0)

# 计算梯度
gradient = cv2.Canny(blurred, 50, 150)  # 低阈值和高阈值

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Canny Edge Detection', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用cv2.imread()函数读取图像,并将其转换为灰度图像(使用cv2.IMREAD_GRAYSCALE参数)。

对图像进行高斯滤波,通过cv2.GaussianBlur()函数实现。这一步骤可以减少噪声对边缘检测的影响。函数的第二个参数是滤波器的大小,这里设置为(5, 5),第三个参数是高斯核的标准差,设置为0表示根据滤波器大小自动计算。

使用cv2.Canny()函数进行Canny边缘检测。函数的第二个和第三个参数是低阈值和高阈值,根据图像的特性可以调整这两个阈值。一般来说,低阈值用于边缘连接,高阈值用于边缘起始。

最后,使用cv2.imshow()函数显示原始图像和Canny边缘检测结果。

注意:在运行代码之前,需要将image.jpg替换为实际的图像文件路径。

4 Roberts算子

Roberts算子是一种经典的边缘检测算子,用于在图像中检测边缘。它是由Lawrence Roberts于1963年提出的。Roberts算子基于离散微分的概念,通过计算像素点与其邻域像素之间的差异来确定边缘的存在。

Roberts算子使用两个2×2的卷积核来计算图像的水平和垂直梯度。这两个卷积核如下:

水平梯度卷积核(Gx):

 1  0
 0 -1

垂直梯度卷积核(Gy):

 0  1
-1  0

Roberts算子的边缘检测步骤如下:

将输入图像转换为灰度图像(如果不是灰度图像)。

对灰度图像分别使用水平梯度卷积核(Gx)和垂直梯度卷积核(Gy)进行卷积操作,得到水平梯度图像和垂直梯度图像。

计算边缘强度图像。可以使用以下公式计算每个像素点的边缘强度:

edge_strength = sqrt(Gx^2 + Gy^2)

其中,Gx和Gy分别为水平梯度图像和垂直梯度图像中的像素值。

可选的阈值处理:根据设定的阈值,将边缘强度图像进行阈值处理,将高于阈值的像素标记为边缘点,低于阈值的像素标记为非边缘点。

Roberts算子的输出结果是一个二值图像,其中边缘像素被标记为白色(255),非边缘像素被标记为黑色(0)。

尽管Roberts算子是边缘检测的一种基础算子,但由于其简单性和计算效率,仍然在某些场景下使用。然而,它对于噪声敏感,并且在边缘检测的准确性和连续性方面可能不如其他更高级的算子(如Sobel、Prewitt和Canny等)。文章来源地址https://www.toymoban.com/news/detail-563062.html

到了这里,关于(计算机视觉课程-笔记1)图像边缘检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉算法中的Canny边缘检测(Canny Edge Detection)

    在计算机视觉领域,边缘检测是一项重要的任务。边缘是图像中物体之间的边界,通过边缘检测可以帮助我们识别出图像中的物体。Canny边缘检测是一种经典且常用的边缘检测算法。本文将对Canny边缘检测算法进行介绍和分析。 Canny边缘检测算法由约翰·Canny在1986年提出,是一

    2024年02月08日
    浏览(42)
  • 计算机视觉——图像视觉显著性检测

    目录 系列文章目录 零、问题描述 一、图像显著性检测 1.定义 2.难点 二、常用评价标准和计算方法 1.综述 2.ROS曲线详述 2.1 混淆矩阵 2.2 ROC曲线简介 2.3 ROC曲线绘制及其判别标准 2.4 ROC曲线补充 三、Fast and Efficient Saliency (FES) 1.算法简介 2.项目导入与解析 3.FES注意预测实践 4.评价

    2024年02月03日
    浏览(56)
  • 【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 7 日论文合集)

    用于图像异常检测的上下文亲和度提取 以往的无监督工业异常检测工作主要集中在局部结构异常,如裂纹和颜色污染。虽然在这种异常上实现了显着的高检测性能,但它们面临着违反远程依赖性的逻辑异常,例如放置在错误位置的正常对象。在本文中,基于以前的知识蒸馏工

    2024年02月12日
    浏览(76)
  • 【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

    Tall:用于深度假冒视频检测的缩略图布局 deepfake对社会和网络安全的威胁日益严重,引起了公众的极大关注,人们越来越多地致力于deepfake视频检测这一关键话题。现有的视频方法实现了良好的性能,但计算密集型。本文介绍了一种简单而有效的策略–缩略图布局(TALL),该

    2024年02月16日
    浏览(72)
  • 目标检测 图像处理 计算机视觉 工业视觉

    从事ai视觉算法有几年了,本帖是对以往做过的计算机视觉项目的一些总结,硬件部署的大多是基于nvidia的开发板和GPU服务器上,如jetson nano,还有地平线J3J5和瑞芯微以及星辰的开发板,另外就是对实时性要求不高的部署在cpu上。有相关项目需求可以一起交流和学习。(+v 3

    2024年02月06日
    浏览(57)
  • 计算机视觉与深度学习-卷积神经网络-卷积&图像去噪&边缘提取-图像去噪 [北邮鲁鹏]

    计算机视觉与深度学习-04-图像去噪卷积-北邮鲁鹏老师课程笔记 噪声点,其实在视觉上看上去让人感觉很难受,直观理解就是它跟周围的像素点差异比较大,显得比较突兀,视觉看起来很不舒服,这就是噪声点。 黑丝像素和白色像素随机出现 白色像素随机出现 使用高斯卷积

    2024年02月07日
    浏览(48)
  • 计算机视觉实验:图像处理综合-路沿检测

    目录 实验步骤与过程 1. 路沿检测方法设计 2. 路沿检测方法实现 2.1 视频图像提取 2.2 图像预处理 2.3 兴趣区域提取 2.4 边缘检测 ​​​​​​​2.5 Hough变换 ​​​​​​​2.6 线条过滤与图像输出 3. 路沿检测结果展示 4. 其他路沿检测方法 实验结论或体会 实验内容: 针对

    2024年02月14日
    浏览(49)
  • 【计算机视觉】【图像处理综合应用】路沿检测

    实验内容: 针对给定的视频,利用图像处理基本方法实现道路路沿的检测; 提示:可利用 Hough 变换进行线检测,融合路沿的结构信息实现路沿边界定位(图中红色的点位置)。 处理视频文件 处理视频文件的主要流程如下: 读取视频 → 逐帧提取 → 路沿检测 → 逐帧保存

    2024年02月05日
    浏览(59)
  • 【北邮鲁鹏老师计算机视觉课程笔记】02 filter

    二进制图像: 灰度图像: 彩色图像: 噪声点让我们看得难受是因为噪声点与周边像素差别很大 滤波核= 卷积核 对应相乘再累加起来 卷积核记录了权值,把权值套到要卷积的目标图上,对应相乘 线性和平移不变形 因为实际使用的时候卷积核是对称的,因此不要求翻转 真实

    2024年02月20日
    浏览(43)
  • 【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)

           随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用。然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导致户外成像设备不能捕捉到高质量的清晰图像,无法正常运用于计算机视觉系统。因此,对雾天图像进

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包