day9 - 对花朵图像进行边缘检测

news/2024/11/9 2:54:42/

本期主要介绍常用于进行图像边缘检测的滤波器(算子):Sobel算子、Scharr算子、Laplacian算子;通过实验比较不同的算子的处理效果以及使用场景。

完成本期内容,你可以:

  • 了解图像梯度的原理和应用

  • 掌握使用Sobel算子、Scharr算子、Laplacian算子进行边缘检测

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


Sobel算子

OpenCV将Sobel算子封装成了cv2.Sobel()方法。

函数原型: dst = cv2.Sobel( src, ddepth, dx, dy[,ksize[, scale[, delta[, borderType]]]] )
dst为输出图像。

参数描述如下:

  • dst:目标图像

  • src:原始图像

  • ddepth:输出图像的深度

  • dx:x方向上的求导阶数。

  • dy:y方向上的求导阶数。

  • ksize:Sobel核的大小。该值为-1时,则会使用Scharr算子进行运算。

  • scale:计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。

  • delta:加在目标图像dst上的值,该值是可选的,默认为0。

  • borderType:边界样式

Scharr算子

OpenCV将Scharr算子封装成了cv2.Scharr() 方法。

函数原型: dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )
dst为输出图像。

参数描述如下:

  • dst:目标图像
  • src:原始图像
  • ddepth:输出图像的深度
  • dx:x方向上的求导阶数。
  • dy:y方向上的求导阶数。
  • scale:计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。
  • delta:加在目标图像dst上的值,该值是可选的,默认为0。
  • borderType:边界样式

Laplacian算子

OpenCV将Laplacian算子封装成了cv2.Laplacian()方法。

函数原型:dst = cv2.Laplacian( src, ddepth[ , ksize[ , scale[ , delta[ , borderType]]]])

参数描述如下:

  • ddepth:输出图像深度。
  • ksize :核的大小
  • scale:计算导数值时的缩放因子(可选)。
  • delta:加到目标图像上的亮度值(可选)。
  • borderType:边界样式。

具体步骤

1. 创建项目结构

创建项目名为对花朵图像进行边缘检测,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

对花朵图像进行边缘检测                    # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

2. 使用不同的算子进行边缘检测

  1. code文件夹下创建edge.py文件;
  2. 导入所需的库,OpenCV;
  3. 读取dataset文件夹下的flower.png图片,并进行展示,标题为flower ;
  4. 分别使用Sobel算子、Scharr算子、Laplacian算子进行图像处理,并展示结果;

步骤一:创建文件并读取图像

代码实现

# 导入OpenCV
import cv2
# 读取图片
o = cv2.imread('../dataset/flower.png')
cv2.imshow('flower',o)

请添加图片描述

原图像

步骤二:使用Sobel算子进行边缘检测

代码实现

# 使用Sobel算子进行边缘检测
# 计算图像x方向的边缘,输出图像深度为64F
Sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)
Sobelx = cv2.convertScaleAbs(Sobelx)
# 计算图像y方向的边缘,输出图像深度为64F
Sobely = cv2.Sobel(o,cv2.CV_64F,0,1)
Sobely = cv2.convertScaleAbs(Sobely)
# 将x和y方向的梯度图加权相加
Sobelxy = cv2.addWeighted(Sobelx,0.5,Sobely,0.5,0)
cv2.imshow('Sobel',Sobelxy)

请添加图片描述

使用Sobel算子进行边缘检测后的效果

步骤三:使用Scharrx算子进行边缘检测

代码实现

# 使用Scharrx算子进行边缘检测
# 计算图像x方向的边缘,输出图像深度为64F
Scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
Scharrx = cv2.convertScaleAbs(Scharrx)
# 计算图像y方向的边缘,输出图像深度为64F
Scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
Scharry = cv2.convertScaleAbs(Scharry)
# 将x和y方向的梯度图加权相加
Scharrxy = cv2.addWeighted(Scharrx,0.5,Scharry,0.5,0)
cv2.imshow('Scharr',Scharrxy)

请添加图片描述

使用Scharrx算子进行边缘检测后的效果

步骤四:使用Laplacian算子进行边缘检测

代码实现

# 使用Laplacian算子进行边缘检测
# 计算图像图像边缘信息,滤波核的大小为3,输出图像深度为64F
Laplacian = cv2.Laplacian(o,cv2.CV_64F,ksize = 3)
Laplacian = cv2.convertScaleAbs(Laplacian)
cv2.imshow("Laplacian",Laplacian)

请添加图片描述

使用Laplacian算子进行边缘检测后的效果

步骤五:关闭窗口

代码实现

cv2.waitKey()
cv2.destroyAllWindows()

3. 结果比较

通过比较三种算子进行边缘检测以后的效果,会发现:三种算子均可以满足图像边缘检测的需求,scharr算子较sobel算子提取的细节边缘更多,Laplacian算子提取边缘后的图像亮度更高。

点击下载源码


http://www.ppmy.cn/news/77100.html

相关文章

NTM中attr的用法

代码1 attrs class CopyTaskParams(object):name attrib(default"copy-task")controller_size attrib(default100, convertint)controller_layers attrib(default1,convertint)num_heads attrib(default1, convertint)sequence_width attrib(default8, convert…

技术大佬们都是怎么学习的?

目录 问题 熟悉更多业务 熟悉端到端 自学 Do exercise Learning trying Teaching 问题 今天逛帖子的时候,看到这么个问题: 这个问题我曾经也很好奇过,那些成为技术大佬的人当初是怎么学习,以及怎么成长过来的&#xff0…

Shellcode分离加载实现免杀的两种方式(VT免杀率:1/68)

简介 本文详细介绍了如何通过文件加载和远程URL加载方式实现Shellcode分离加载,以规避安全软件的检测。文章首先描述了通过Metasploit Framework生成的shellcode文件加载的过程,并提供了相关的C代码。 为了避免被杀毒软件检测,利用动态API调…

论文分享 A ConvNet for the 2020s

摘要 视觉识别的“咆哮的 20 年代”始于 Vision Transformers (ViTs) 的引入,它迅速取代了 ConvNets,成为最先进的图像分类模型。另一方面,vanilla ViT 在应用于对象检测和语义分割等一般计算机视觉任务时面临困难。正是层次化的 Transforme…

从零实现一个数据库(DataBase) Go语言实现版 4.B树实现(Part1))

英文源地址 本章将使用Go语言实现一个不可变地B树.这是一个最小实现, 因此很容易理解. Node节点的格式 我们的B树最终将被持久化到磁盘上, 因此我们首先需要为b树节点设计数据格式.如果没有这种格式, 我们将无法知道节点的大小以及何时拆分节点. 一个节点包含: 一个固定大小…

伦茨科技带你了解蓝牙App开发的流程

随着移动互联网的快速发展,给我们的生活带来了越来越多的便利,蓝牙App的开发也越来越普及。那么,简单来说,蓝牙App软件的开发就是在手机上为蓝牙物理设备提供具有相关功能的App软件终端,让蓝牙设备更方便的为用户提供服…

如何恢复电脑上删除的文件

在我们使用电脑的过程中,难免会出现误删文件的情况。而一旦误删,让人头痛的就是如何恢复电脑上删除的文件。其实,在大多数情况下,我们仍有机会从电脑中恢复已删除的文件,但需要注意的是,任何的操作都要先停…

基于用户认证数据构建评估模型预测认证行为风险系统(附源码)

文件说明 datasets // 数据集(训练集、测试集) feature engineering // 特征工程 models // 评估模型 测试环境 Python3.8 任务描述 项目来自系统认证风险预测https://www.datafountain.cn/competitions/537 项目完整源码下载:https://download.csdn.net/download/liu…