首页 > 其他分享 >机器学习:opencv--图像边缘检测

机器学习:opencv--图像边缘检测

时间:2024-09-05 22:24:27浏览次数:10  
标签:full Sobel 边缘 -- 算子 cv2 opencv 图像 yuan

目录

前言

一、图像边缘检测

1.边缘检测        

2.边缘检测的方法

二、Sobel算子

1.Sobel算子        

2.计算

3.代码实现

4.代码步骤解析

1.导入图片

2.处理x轴和y轴的边缘并相加

三、Scharr算子

1.Scharr算子

2.计算

3.代码实现

四、Laplacian算子

1.Laplacian算子

2.计算

3.代码实现

五、Canny边缘检测算法

1.Canny

2.计算

3.代码实现

总结


前言

        本篇将介绍图像边缘检测的Sobel、Scharr和Laplacian算子以及Canny边缘检测算法及其效果。

 

一、图像边缘检测

1.边缘检测        

        是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。

 

2.边缘检测的方法

 

 

二、Sobel算子

1.Sobel算子        

        Sobel 算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。

 

2.计算

        计算过程简单的来说就是x轴放箱费和y轴方向各一个矩阵,对图像的所有像素点做卷积操作寻找梯度

 

3.代码实现

完整代码:

import cv2

"""Sobel算子"""
yuan = cv2.imread('../yuan.png')
cv2.imshow('yuan', yuan)
cv2.waitKey(0)

'''x方向上的边缘'''
# 右端为负值 显示不出来
yuan_x_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=1, dy=0)
cv2.imshow('yuan_x_64', yuan_x_64)
cv2.waitKey(0)

# 进行取绝对值操作即可
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full', yuan_x_full)
cv2.waitKey(0)

'''y方向上的边缘'''
# y的下端为负值 显示不出来
# 进行取绝对值操作即可
yuan_y_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=0, dy=1)
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y_full', yuan_y_full)
cv2.waitKey(0)

'''使用加权运算组合图像得到完整边缘'''
yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 10)
cv2.imshow('yuan_xy_full', yuan_xy_full)
cv2.waitKey(0)
cv2.destroyAllWindows()

"""使用彩色图获取边缘"""
zrn = cv2.imread('../zrn.jpg', cv2.IMREAD_GRAYSCALE)
zrn = cv2.resize(zrn, (400, 400))
x = cv2.Sobel(zrn, cv2.CV_64F, dx=1, dy=0)
y = cv2.Sobel(zrn, cv2.CV_64F, dx=0, dy=1)
x_full = cv2.convertScaleAbs(x)
y_full = cv2.convertScaleAbs(y)
xy = cv2.addWeighted(x_full, 1, y_full, 1, 0)
cv2.imshow('zrn_Sobel', xy)
cv2.waitKey(0)

输出:

 

4.代码步骤解析

1.导入图片

import cv2

"""Sobel算子"""
yuan = cv2.imread('../yuan.png')
cv2.imshow('yuan', yuan)
cv2.waitKey(0)

2.处理x轴和y轴的边缘并相加

  • x轴:
'''x方向上的边缘'''
# 右端为负值 显示不出来
yuan_x_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=1, dy=0)
cv2.imshow('yuan_x_64', yuan_x_64)
cv2.waitKey(0)

# 进行取绝对值操作即可
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full', yuan_x_full)
cv2.waitKey(0)

输出:

左边的右边边缘没显示出来是因为进行计算之后这些位置的像素值为负值,显示不出来。

经过取绝对值操作之后即可完整显示出来

 

  • 完整边缘:

y轴的处理与x轴一致

完整的边缘只需将两个轴上的数据进行加权相加即可

'''y方向上的边缘'''
# y的下端为负值 显示不出来
# 进行取绝对值操作即可
yuan_y_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=0, dy=1)
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y_full', yuan_y_full)
cv2.waitKey(0)

'''使用加权运算组合图像得到完整边缘'''
yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 10)
cv2.imshow('yuan_xy_full', yuan_xy_full)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终结果:

 

三、Scharr算子

1.Scharr算子

        Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。

 

2.计算

计算过程与sobel算子相同,只是所用矩阵有差别

 

3.代码实现

完整代码:

  • 实现步骤与Sobel的步骤一模一样,在此就不过多赘述了。
import cv2

"""Scharr(xia)算子"""
zrn1 = cv2.imread('../zrn.jpg', cv2.IMREAD_GRAYSCALE)
zrn1 = cv2.resize(zrn1, (400, 400))
x = cv2.Scharr(zrn1, cv2.CV_64F, dx=1, dy=0)
y = cv2.Scharr(zrn1, cv2.CV_64F, dx=0, dy=1)
x_full = cv2.convertScaleAbs(x)
y_full = cv2.convertScaleAbs(y)
xy = cv2.addWeighted(x_full, 1, y_full, 1, 0)
cv2.imshow('zrn_Scharr', xy)
cv2.waitKey(0)

输出:

 

四、Laplacian算子

1.Laplacian算子

        不再以x和y的方向计算,而是以圆方向计算变化率。因此不需要Gx+Gy。

 

2.计算

简单来说就是只使用一个矩阵去跟所有的点进行卷积,得到的结果直接作为边缘

 

3.代码实现

完整代码:

步骤就是将Sobelx轴和y轴的步骤合二为一,并将取绝对值和加权相加的步骤去除了

import cv2

"""Laplacian算子"""
zrn1 = cv2.imread('zrn.jpg', cv2.IMREAD_GRAYSCALE)
zrn1 = cv2.resize(zrn1, (400, 400))
lap = cv2.Laplacian(zrn1, cv2.CV_64F, delta=10)
lap_full = cv2.convertScaleAbs(lap)
cv2.imshow('zrn_Lap', lap_full)
cv2.waitKey(0)

输出:

 

五、Canny边缘检测算法

1.Canny

        Canny 边缘检测是一种图像处理技术,用于检测图像中的边缘。它通过以下几个步骤实现:首先对图像进行平滑处理以减少噪声;接着计算每个像素的梯度强度和方向;然后进行非极大值抑制以精确定位边缘;最后应用双阈值化和边缘连接来确定最终的边缘。这种方法能有效地识别和提取图像中的显著边缘。

 

2.计算

canny的计算分为四步

  1. 图像降噪
  2. 梯度计算
  3. 非极大值抑制
  4. 双阈值边界跟踪

具体内容感兴趣的可以搜索查看

 

3.代码实现

完整代码:

使用算法的代码就cv2.Canny()那一行,数字参数代表高低阈值,可以自己调试看看效果有何不同

import cv2

"""Canny算子"""
suda = cv2.imread('suda.jpg', cv2.IMREAD_GRAYSCALE)
suda = cv2.resize(suda, (400, 400))
cv2.imshow('suda', suda)
cv2.waitKey(0)
can = cv2.Canny(suda, 100, 200)  # 低阈值 高阈值
cv2.imshow('suda_canny', can)
cv2.waitKey(0)

输出:

 

总结

        这么多种算法各有千秋,面对每种情况可以选择适合的算法

标签:full,Sobel,边缘,--,算子,cv2,opencv,图像,yuan
From: https://blog.csdn.net/weixin_65047977/article/details/141829703

相关文章

  • 基础网络安全——K8S关键概念及搭建过程中遇到的问题补充
    一、K8S集群基本概念             k8s是一组服务器集群,是一个分布式的容器编排系统,对运行在集群上的容器进行管理,K8S集群包括控制平面(ControlPlane)以及1个或者多个工作节点(workernode),而控制平面包括masternode以及etcd节点。并且在这两种类型的节点上运行多种不......
  • 常见概念 -- DCM色散补偿
    色散的概念光是一种电磁波,在特定介质中,光的相速度随频率(波长)或传输模式有差异,造成光波在通过介质后,不同频率成分光波的相位形成分散或分离的效果,称为色散。日常生活中,最广为人知的色散现象是白光(复合光)通过三棱镜后形成彩色光带(光谱)的效果。在光纤传输中也存在色散效应......
  • 数据库tips11
    标准SQL中的权限收回语法为:REVOKE<权限>[,<权限>…]ON[<对象类型>]<对象名>FROM<用户>[,<用户>...];其中属性列的修改权限用UPDATE(<列名>)来表达;其中属性列的执行权限用EXECUTE;PUBLIC表示所有用户。事物的结束语句是ROLLBACK和COMMIT。当事务执行中出错时,使用ROLLBACK对当前事......
  • 常见概念 -- 色度色散与偏振模色散
    色度色散(CD)由于光纤中不同波长对应不同的传输速度,不同波长到达相同距离的光纤的时间不同,从而导致光脉冲展宽。偏振模色散(PMD)由于光纤的随机性双折射,不同相位状态的光传播速度不同,使光脉冲展宽。色散对系统的影响CD色散和PMD色散造成时域上的光脉冲展宽,会引起信号......
  • Python中的“类的属性与方法”:解锁面向对象编程的奥秘
    在这个充满数据的世界里,Python作为一门强大的编程语言,已经成为了许多开发者的首选工具。而在Python中,类的属性与方法则是构建复杂系统不可或缺的一部分。它们不仅能够帮助我们更好地组织代码,还能提高程序的可读性和维护性。今天,就让我们一起探索类的属性与方法的魅力所在,从基础到进......
  • Python中的继承艺术:解锁代码复用的无限可能
    在编程的世界里,代码复用一直是一个备受关注的话题。而Python,作为一门优雅且强大的编程语言,提供了多种方式来帮助我们实现这一目标。其中,“继承”作为面向对象编程的一个核心概念,在Python中扮演着至关重要的角色。它不仅能够简化代码结构,提高开发效率,还能增强程序的可维护性和可扩展......
  • 机器学习:opencv图像识别--模版匹配
    目录一、模版匹配的核心概念1.图片模板匹配是一种用于在图像中查找特定模式或对象的技术。2.模板图像3.目标图像4.滑动窗口5.相似度度量6.匹配位置二、模版匹配的步骤1.准备图像:2.预处理:3.匹配:4.定位最佳匹配:5.标记结果:6.显示或处理结果:三、代码实现一、模版......
  • 西陆健身系统V1.0.0
    健身系统,支持多城市、多门店,包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型,支持在线排课。私教可以通过上课获得收益,在线申请提现。目前Uniapp仅支持编译微信小程序。提供全部无加密源代码,支持私有化部署。V1.0.0发布版本......
  • PYthon基础入门 day01——PYthon基础语法(上)
    目录一.注释二.语句结束符和分行符1.语句结束符2.分行符三.行和缩进四.变量及数据类型1.变量2.数据类型3.数字(Numbers)数据类型4.字符串(String)5.列表(List)6.元组(Tuple)7.字典(Dictionary)五.数据类型的转换六.标识符与关键字1.标识符2.关键字一.注释在PYthon中......
  • 海报在线制作系统V1.0.3
    V1.0.3修复已知问题1、兼容多平台云存储上传2、修复小程序端海报背景图片不生成3、修复pc端登录问题4、修复海报删除问题......