对于图像的处理,基本的步骤是这样的:
取得图像数据 —— 将图像进行平滑处理 —— 进行边缘检测,阈值分析 —— 进行形态学的操作 —— 获取某些特征点 —— 分析数据

那么在这里,我就讲解下边缘检测的这部分,然后后续再进行其他的讲解。

在OpenCV中,边缘检测的方法有以下几种:
Sobel
Scharr
Laplace
Canny
其中前三种的边缘检测是带方向的

那么我们就先从Sobel算子开始讲起吧!
先来看看Sobel方法的定义
def Sobel
(src,ddepth,dx,dy,dst=None,ksize=None,scale=None,delta=None,borderType=None)

ddepth:图像的颜色深度,针对不同的输入图像,输出目标图像有不同的深度,具体组合如下:
- 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F
- 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F
- 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F
- 若src.depth() = CV_64F, 取ddepth = -1/CV_64F
dx:int类型的,表示x方向的差分阶数,1或0
dy:int类型的,表示y方向的差分阶数,1或0
kSize:模板大小,前面虽然提到过,不过对于Sobel算子这里要补充下,这里的取值为1,3,5,7,当不输入的时候,默认为3。特殊的,当kSize = 1的时候,采用的模板为1*3或者3*1 而非平时的那些格式。

接下来看Scharr的定义
def Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None)
会看到参数和Sobel算子一致,不过,该函数与Sobel的区别在于,Scharr仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确

接下来我们看下这俩的比较:

第一列显示的Sobel算子的在默认3*3模板下的图像,第二列显示的是Scahrr算子在默认3*3模板下的图像,会发现有明显的不同,Scharr给出的更为精确。第三列放的原图像和Sobel算子x=1 y=1的情况。 代码如下:

import cv2img = cv2.imread("C:/Users/DELL/Desktop/img.jpg")gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)sobel_x = cv2.Sobel(gray, cv2.CV_8U, 1, 0)
sobel_y = cv2.Sobel(gray, cv2.CV_8U, 0, 1)
sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 1)scharr_x = cv2.Scharr(gray, cv2.CV_8U, 1, 0)
scharr_y = cv2.Scharr(gray, cv2.CV_8U, 0, 1)cv2.imshow("src", img)
cv2.imshow("Sobel_x", sobel_x)
cv2.imshow("Sobel_y", sobel_y)
cv2.imshow("Sobel", sobel)
cv2.imshow("Scharr_x", scharr_x)
cv2.imshow("Scharr_y", scharr_y)cv2.waitKey(0)

接下来讲下Laplace
def Laplacian(src,ddepth,dst=None,ksize=None,scale=None,delta=None,borderType=None)
scale:Double类型的,计算拉普拉斯可选比例因子,有默认值1
delta:加到输出像素的值,默认为0
borderType:边界模式。默认值BORDER_DEFAULT

Laplace其实利用Sobel算子的运算,它通过Sobel算子运算出图像在x方向和y方向的导数,来得到我们载入图像的拉普拉斯变换结果。
这里简单看下Laplace的说明,就在方法里面的

 The function calculates the Laplacian of the source image by adding up the second x and y.   derivatives calculated using the Sobel operator:

由于这个,我这里特意选取了同样kSize的两种方法做下比较:

发现Laplace的轮廓更为清晰。
我觉得Laplace算是Sobel的升级版。

代码如下:

import cv2img = cv2.imread("C:/Users/DELL/Desktop/img.jpg")gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)laplace = cv2.Laplacian(gray, cv2.CV_8U, ksize=3)
sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 1)cv2.imshow("Laplace", laplace)
cv2.imshow("Sobel", sobel)cv2.waitKey(0)

最后讲下Canny函数:
def Canny(image,threshold1,threshold2,edges=None,apertureSize=None,L2gradient=None)

threshold1:int类型的,低阈值
threshold2:int类型的,高阈值
edeges:单通道存储边缘的输出图像
apertureSize:Sobel算子内核(kSize)大小
L2gradiend:Bool类型的,为真表示使用更精确的L2范数进行计算(两个方向的倒数的平方再开放),为假表示用L1范数(直接将两个方向导数的绝对值相加)

由于和阈值相关,那么我们这里就不指定阈值了,使用进度条的方式来调整阈值获得我们想要图像,直接上图,进度值直接看图吧:

会发现,当我们改变阈值后,图像后渐渐过滤掉一些背景,当然,重在阈值的选取上,当阈值选大的时候,也是会将图像的特征完全损坏的。

代码如下:

import cv2img = cv2.imread("C:/Users/DELL/Desktop/img.jpg")gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)gauss = cv2.GaussianBlur(gray, (3, 3), 1)def doCanny(x):position = cv2.getTrackbarPos("CannyBar", "Canny")canny = cv2.Canny(gauss, position, position*2.5)cv2.imshow("Canny", canny)cv2.namedWindow("Canny")cv2.createTrackbar("CannyBar", "Canny", 1, 100, doCanny)cv2.waitKey(0)

OpenCV边缘检测(Sobel,Scharr,Laplace,Canny)相关推荐

  1. 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测

    canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...

  2. Halcon边缘检测Sobel、Laplace和Canny算子

    提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者. 文章目录 前言 一.像素级边缘提取 1.经典的边缘检测算子 2.边缘检测的一般流程 3.sobel_amp 算子 参考文献 ...

  3. OpenCV学习-P34-P38 Opencv边缘检测

    OpenCV学习-P34-P37 Opencv边缘检测 Sobel检测算子 Laplacian检测算子 Canny边缘检测算法 边缘检测总结 边缘检测分为两类:基于搜索和基于零穿越 基于搜索:寻找图像 ...

  4. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  5. OpenCV 笔记 -- 边缘检测(Sobel、Laplace、Canny)

    OpenCV 笔记 – 边缘检测(Sobel.Laplace.Canny) 参考文档 一.Sobel 算子 1.简介 Sobel 算子是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度近似值.在 ...

  6. sobel边缘检测python_python实现:prewitt, laplace,sobel,scharr, canny, hed

    代码:butub1/Edge-detection​github.com 哭了,实现了的一个赞没有,上面讲理论的一堆赞...................... CatalogFilters Nois ...

  7. 点、线和边缘检测 个人笔记(含Sobel和Laplace等算子、Marr-Hildreth和Canny实现及Hough变换)

    文章目录 1. 前言 2. 使用OpenCV 3 处理图像 笔记 2.1 傅里叶变换及相关.卷积 2.2 个人总结 2.3 相关链接 3. 点.线和边缘检测 笔记 3.1 背景知识 3.2 孤立点的检 ...

  8. OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例(附完整代码)

    OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr O ...

  9. [Python从零到壹] 五十九.图像增强及运算篇之图像锐化Scharr、Canny、LOG实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. 1732 Fibonacci数列 2
  2. 用Ajax 构建关键任务的企业级Web 应用 ——《深入 Ajax :架构与最佳实践》
  3. golang 变量定义和初始化
  4. python【蓝桥杯vip练习题库】ADV-297快速排序
  5. 解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误
  6. linux fedora35安装kvm虚拟机命令整理
  7. 二叉树和栈的基本操作
  8. graphql-yoga的安装步骤
  9. 物联网卡加持智能电网,发展更具优势
  10. Java 强引用、弱引用、软引用、虚引用
  11. ZZULIOJ 1108: 打印数字图形(函数专题)
  12. 终于我还是没忍住,用Python爬了一波女神
  13. App后台开发运维和架构实践学习总结(6)——App客户端与后台交互方式总结
  14. linux 时间服务器安装配置
  15. VAssistX使用总结
  16. 全面剖析雅虎助手以及网络实名的流氓行径
  17. 中班音乐计算机反思,幼儿园音乐活动反思10篇
  18. 系统接口框架设计与实现
  19. Java面试-重写和重载的规则
  20. ultravnc中文版,5步教你如何进行ultravnc中文版配置

热门文章

  1. 京东服务技术中台:你必须知道的全流程建设方法论!
  2. 中毒U盘恢复--快捷键病毒
  3. 西门子(中国)有限公司
  4. 如何设置windows7无线服务器,Windows7系统设置迷你无线路由器的方法
  5. 【云原生】Docker镜像详细讲解
  6. 挖矿脚本bioset攻击解决
  7. 如何实现Jenkins 编译结果通知到QQ好友及QQ群组很遗憾 2019年1月1日腾讯停止了webqq机器人的服务支持...
  8. 5555~面吸多久才能看到效果,面吸后多久能消肿,心急啊
  9. 比较出名的人工智能模型有哪些
  10. 使用计算机来进行翻译属于计算机,【判断题】【判断题】遇到诈骗案件时,只要最后一个关口也就是汇款的那一关节守牢就不会有问题。()...