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边缘检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django User 模块之 AbstractUser 扩展详解

    Django User 模块之 AbstractUser 扩展详解

    这篇文章主要介绍了Django User 模块之 AbstractUser 扩展详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python实现指定区域桌面变化监控并报警

    Python实现指定区域桌面变化监控并报警

    在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-07-07
  • python快速安装OpenCV的步骤记录

    python快速安装OpenCV的步骤记录

    这篇文章主要给大家介绍了关于python快速安装OpenCV的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • python下载文件的两种方式

    python下载文件的两种方式

    这篇文章主要介绍了python下载文件的两种方式:接口方式和Nginx这两种方式,并通过代码示例讲解的非常详细,对大家学习python下载文件有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • 读Json文件生成pandas数据框详情

    读Json文件生成pandas数据框详情

    这篇文章主要介绍了读Json文件生成pandas数据框详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • Python如何处理异常报错方法(建议收藏!)

    Python如何处理异常报错方法(建议收藏!)

    开发程序其实就像预测天气一样,即使是代码的异常错误,也应该能预测且被控制,下面这篇文章主要给大家介绍了关于Python如何处理异常报错方法的相关资料,需要的朋友可以参考下
    2022-06-06
  • Python Django实现layui风格+django分页功能的例子

    Python Django实现layui风格+django分页功能的例子

    今天小编就为大家分享一篇Python Django实现layui风格+django分页功能的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python制作Windows凭据添加工具

    Python制作Windows凭据添加工具

    这篇文章主要为大家详细介绍了如何使用Python制作Windows凭据添加工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • 在Python的Django框架中更新数据库数据的方法

    在Python的Django框架中更新数据库数据的方法

    这篇文章主要介绍了在Python的Django框架中更新数据库数据,对此Django框架中提供了便利的插入和更新方法,需要的朋友可以参考下
    2015-07-07
  • OpenCV利用python来实现图像的直方图均衡化

    OpenCV利用python来实现图像的直方图均衡化

    这篇文章主要介绍了OpenCV利用python来实现图像的直方图均衡化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论