本期主要介绍常用于进行图像边缘检测的滤波器(算子):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算子提取边缘后的图像亮度更高。

点击下载源码

day9 - 对花朵图像进行边缘检测相关推荐

  1. 利用OpenCV的库函数Sobel和Scharr作图像的边缘检测

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像边缘检测的概念我就不多说了,可以参考上一篇博 ...

  2. 【Matlab 图像】边缘检测算法及效果演示

    [Matlab 图像]边缘检测算法及效果演示 边缘检测 检测图像中的边缘 Matlab 代码 代码效果如下 边缘算法:robert 边缘算法:sobel prewitt 边缘算法:laplacian ...

  3. 二值形态学操作、图像的边缘检测、图像编码

    实验五 二值形态学操作 一.实验目的  了解二值形态学的基本运算  掌握基本形态学运算的Matlab实现  了解形态操作的应用 二.原理     收缩和膨胀是数学形态学最基本的变换,数学形态学的 ...

  4. OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测

    在笔记十四中,我们使用了Sobel算子对图像进行边缘检测,理论依据是像素变化最快的地方最有可能是边缘处,所以使用sobel算子对图像做微分,得到的结果图像当中灰度较大的区域,即为边缘处. 在这里,我们 ...

  5. tensorflow2.4使用GooleNet实现识别植物花朵图像项目

    tensorflow2.4使用GooleNet实现识别植物花朵图像项目 1. 数据集下载 链接:https://pan.baidu.com/s/1zs9U76OmGAIwbYr91KQxgg 提取码: ...

  6. 如何使用OpenCV进行图像的边缘检测和边缘增强?

    OpenCV提供了几种常见的边缘检测算法,包括Sobel.Scharr.Laplacian和Canny等.这些算法可以帮助我们找到图像中的边缘并增强它们,以提取有用的特征或分割图像中的对象. 如何使用 ...

  7. IOS OpenGL ES GPUImage 图像Sobel边缘检测,类似漫画反色 GPUImageSobelEdgeDetectionFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  8. 图像的边缘检测-三种方法

    图像的边缘检测: 比较拉普拉斯算子,LOG算子,Canny算子三种边缘检测算法. 编程思路: 图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚 ...

  9. 【有三说图像】边缘检测(上)

    02 这是有三说图像第2期,边缘检测上篇 言有三 毕业于中国科学院,计算机视觉方向从业者,有三工作室等创始人 作者 | 言有三(微信号Longlongtogo) 编辑 | 言有三 这是<有三说图 ...

最新文章

  1. C# WinForm 技巧十: 开发工具
  2. 使用ansible来调度cron作业
  3. response.addCookie(cookie)添加cookie失败.
  4. 软文:第三方支付技术的场景应用,支付技术延伸与国际化
  5. 【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单...
  6. SAP ABAP Netweaver和Hybris Commerce的部署策略
  7. 在ASP.NET Core微服务架构下使用数据库切分和扩展
  8. BFPTR算法详解+实现+复杂度证明
  9. 每日优鲜小程序基础组件介绍
  10. fullcalendar 上下月翻动事件_用期权做事件套利的黄金法则
  11. python 爬虫框架_小白学 Python 爬虫(28):自动化测试框架 Selenium (下)
  12. linux lamp实验报告,新手学Linux--构建lamp
  13. python读取大文件太慢_强悍的Python读取大文件的解决方案
  14. 2021年安全员-A证报名考试及安全员-A证考试报名
  15. VUE中常用的UI库
  16. 无人驾驶虚拟仿真(四)--通过ROS系统控制小车行走
  17. QT开发应用程序(17)-- 读写XLS文件
  18. java js hexmd5_JAVA与JS在MD5上问题
  19. Debian编译内核教程
  20. 小说程序源码 自动采集

热门文章

  1. 英语口语103之每日十句口语
  2. python爬取图片并且保存到本地指定文件夹内
  3. 深度学习,自然语言处理和表征方法
  4. 什么是python的全局解释锁(GIL)
  5. python使用pymodbus库进行modbus tcp通信
  6. Linux中的休眠函数
  7. 易语言PHP非对称加密,RSA非对称加密通信源码
  8. Shadow插件化框架设计——replugin原理(架构师进阶之旅)
  9. 基于3d的方式把图片渲染成视频
  10. 灰尘GP2Y10F传感器时序详解