Python图像处理之边缘检测原理详解

 更新时间:2022年12月05日 10:45:54   作者:夏天是冰红茶  
边缘检测是图像处理和计算机视觉当中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。本文将通过示例和大家介绍一下边缘检测的原理,希望对大家有所帮助

原理

边缘检测是图像处理和计算机视觉当中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,图像的边缘检测可以大幅度的减少数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性,它们绝大多数可以分为两类:基于搜索和基于零穿越。

基于搜索:通过寻找图像一阶导数中max来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并在此方向找到局部梯度模的最大值,代表的算法是Sobel算子和Scharr算子。

基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,代表算法是Laplacian算子。 

Sobel检测算子

Sobel边缘检测算法比较简单,实际应用中效率要比Canny边缘检测算法效率要高,但边缘检测效果不如Canny准确,但很多常会它依旧是首选,它是高斯平滑与微分操作的结合体,所以其抗燥声能力很强,用途较多,尤其是对效率要求较高,而对细纹理不是很在意的情况下。

方法

 那么我们看到上图最后一个式子,在某一个领域内,某一方向上,前一个像素与后一个像素的差,除以(x+1)-(x-1)=2,就得到当前的一个一阶导数,这就是Sobel算子的一个思想。

这里假设要处理的对象为I,在两个方向求导:

  • 水平变化:将图像I与奇数大小的模板进行卷积,结果为Gx。
  • 垂直变化:将图像I与奇数大小的模板进行卷积,结果为Gy。

如下,模板为3;

最后,统计极大值所在的位置,即为图像的边缘

注:当内核大小为3时,以上Sobel内核可能会产生比较明显的误差,为解决这一个问题,我们使用Scharr函数,但该函数仅作用于大小为3的内核,该函数的运行速度与Sobel算子一样快,但结果更加精准,其计算方法为下图所示:

应用

 Opencv当中的API为:

sobel_x_or_y=Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None)
 
"""
src:传入图像
ddepth:图像的深度
dx、dy=指求导的阶数,0表示这个方向上没有求导,取值为0、1
ksize=是Sobel算子的大小,即卷积核的大小,为奇数(1,3,5,7等),默认是3
scale:缩放导数的比例常数,默认没有
borderType:函数的边界模式,默认是cv2.BORDER_DEFAULT
"""

Sobel函数求导后会有负数,还有大于255的值,原图像为uint8,8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此,要用16位有符号的数据类型,即cv2.CV_16S(放到深度中)。处理完图像后,再使用cv2.convertScaleAbs()函数将其再转为uint8格式,否则无法显示图像。

Sobel算子是两个方向计算的,最后要用cv2.addWeighted()函数将其组合起来

Scale_abs=cv2.convertScaleAbs(x)
result=cv2.addWeighted(scr1,alpha,scr2,beta)  #混合x,y方向
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
img=cv2.imread("Images/1-1.jpg",0)
#Sobel:x,y方向
x=cv2.Sobel(img,cv2.CV_16S,1,0)
y=cv2.Sobel(img,cv2.CV_16S,0,1)
#数据转化
Scale_absx=cv2.convertScaleAbs(x)
Scale_absy=cv2.convertScaleAbs(y)
#混合图像
result=cv2.addWeighted(Scale_absx,0.5,Scale_absy,0.5,0)
 
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuantu')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap=plt.cm.gray),plt.title('Sobel')
plt.xticks([]),plt.yticks([])
plt.show()

而Scharr,就是将Sobel算子当中的变成ksize=-1。

x=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=-1)
y=cv2.Sobel(img,cv2.CV_16S,0,1,ksize=-1)

可以看到,Scharr检测的细节更加多一些。 

Laplacian算子

laplacian是利用二阶导数来检测边缘。因为图像是“二维”,需要在两个方向上求导,如下所示

API:

laplacian=cv2.Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None)
 
"""
src:图像
Ddepth:图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须要大于等于原图像的深度;
ksize:卷积核的大小,必须为奇数
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
img=cv2.imread("Images/1-1.jpg",0)
 
result=cv2.Laplacian(img,cv2.CV_16S)
Scale_abs=cv2.convertScaleAbs(result)
 
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuantu')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap=plt.cm.gray),plt.title('laplacian')
plt.xticks([]),plt.yticks([])
plt.show()

算子比较

到此这篇关于Python图像处理之边缘检测原理详解的文章就介绍到这了,更多相关Python边缘检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python tornado上传文件的功能

    Python tornado上传文件的功能

    这篇文章主要介绍了Python tornado上传文件的功能,代码分为普通上传和ajax上传,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • python绘制三维图的详细新手教程

    python绘制三维图的详细新手教程

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,下面这篇文章主要给大家介绍了关于python绘制三维图的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Python使用MySQL8.2读写分离实现示例详解

    Python使用MySQL8.2读写分离实现示例详解

    在这篇文章中,我们将了解如何将 MySQL 8.2 的读写分离功能与 MySQL-Connector/Python 一起使用的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python中把嵌套的列表合并成一个列表方法总结

    python中把嵌套的列表合并成一个列表方法总结

    python中list这种数据结构很常用到,下面这篇文章主要给大家介绍了关于python中把嵌套的列表合并成一个列表方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • python基础教程之Hello World!

    python基础教程之Hello World!

    这篇文章主要介绍了python基础教程之Hello World!,本文讲解了命令行中、文件中、脚本文件中输出Hello World的例子,需要的朋友可以参考下
    2014-08-08
  • Python+Tkinter制作猜灯谜小游戏

    Python+Tkinter制作猜灯谜小游戏

    元宵节,又称上元节、灯节,是春节之后的第一个重要节日。而元宵节除了吃元宵、看花灯,还有一件最重要的事情就是猜灯谜!因此本文将通过Python Tkinter制作一个猜灯谜小游戏,感兴趣的小伙伴可以了解一下
    2022-02-02
  • 详解PyTorch手写数字识别(MNIST数据集)

    详解PyTorch手写数字识别(MNIST数据集)

    这篇文章主要介绍了详解PyTorch手写数字识别(MNIST数据集),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 深入详解Python中sys模块的功能与应用

    深入详解Python中sys模块的功能与应用

    在Python的标准库中,sys模块是一个常用而强大的工具,它提供了与Python解释器交互的函数和变量,本文将介绍sys模块的一些常用函数和方法,并通过实际的代码实例来解析它们的用法,希望对大家有所帮助
    2024-03-03
  • Python设计模式之MVC模式简单示例

    Python设计模式之MVC模式简单示例

    这篇文章主要介绍了Python设计模式之MVC模式,简单介绍了MVC模式的概念、原理,并结合实例形式给出了Python实现与使用MVC模式的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • Django 自定义404 500等错误页面的实现

    Django 自定义404 500等错误页面的实现

    这篇文章主要介绍了Django 自定义404 500等错误页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论