OpenCV边缘检测(Sobel,Scharr,Laplace,Canny)
对于图像的处理,基本的步骤是这样的:
取得图像数据 —— 将图像进行平滑处理 —— 进行边缘检测,阈值分析 —— 进行形态学的操作 —— 获取某些特征点 —— 分析数据
那么在这里,我就讲解下边缘检测的这部分,然后后续再进行其他的讲解。
在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)相关推荐
- 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测
canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...
- Halcon边缘检测Sobel、Laplace和Canny算子
提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者. 文章目录 前言 一.像素级边缘提取 1.经典的边缘检测算子 2.边缘检测的一般流程 3.sobel_amp 算子 参考文献 ...
- OpenCV学习-P34-P38 Opencv边缘检测
OpenCV学习-P34-P37 Opencv边缘检测 Sobel检测算子 Laplacian检测算子 Canny边缘检测算法 边缘检测总结 边缘检测分为两类:基于搜索和基于零穿越 基于搜索:寻找图像 ...
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- OpenCV 笔记 -- 边缘检测(Sobel、Laplace、Canny)
OpenCV 笔记 – 边缘检测(Sobel.Laplace.Canny) 参考文档 一.Sobel 算子 1.简介 Sobel 算子是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度近似值.在 ...
- sobel边缘检测python_python实现:prewitt, laplace,sobel,scharr, canny, hed
代码:butub1/Edge-detectiongithub.com 哭了,实现了的一个赞没有,上面讲理论的一堆赞...................... CatalogFilters Nois ...
- 点、线和边缘检测 个人笔记(含Sobel和Laplace等算子、Marr-Hildreth和Canny实现及Hough变换)
文章目录 1. 前言 2. 使用OpenCV 3 处理图像 笔记 2.1 傅里叶变换及相关.卷积 2.2 个人总结 2.3 相关链接 3. 点.线和边缘检测 笔记 3.1 背景知识 3.2 孤立点的检 ...
- OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例(附完整代码)
OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr O ...
- [Python从零到壹] 五十九.图像增强及运算篇之图像锐化Scharr、Canny、LOG实现边缘检测
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
最新文章
- 1732 Fibonacci数列 2
- 用Ajax 构建关键任务的企业级Web 应用 ——《深入 Ajax :架构与最佳实践》
- golang 变量定义和初始化
- python【蓝桥杯vip练习题库】ADV-297快速排序
- 解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误
- linux fedora35安装kvm虚拟机命令整理
- 二叉树和栈的基本操作
- graphql-yoga的安装步骤
- 物联网卡加持智能电网,发展更具优势
- Java 强引用、弱引用、软引用、虚引用
- ZZULIOJ 1108: 打印数字图形(函数专题)
- 终于我还是没忍住,用Python爬了一波女神
- App后台开发运维和架构实践学习总结(6)——App客户端与后台交互方式总结
- linux 时间服务器安装配置
- VAssistX使用总结
- 全面剖析雅虎助手以及网络实名的流氓行径
- 中班音乐计算机反思,幼儿园音乐活动反思10篇
- 系统接口框架设计与实现
- Java面试-重写和重载的规则
- ultravnc中文版,5步教你如何进行ultravnc中文版配置
热门文章
- 京东服务技术中台:你必须知道的全流程建设方法论!
- 中毒U盘恢复--快捷键病毒
- 西门子(中国)有限公司
- 如何设置windows7无线服务器,Windows7系统设置迷你无线路由器的方法
- 【云原生】Docker镜像详细讲解
- 挖矿脚本bioset攻击解决
- 如何实现Jenkins 编译结果通知到QQ好友及QQ群组很遗憾 2019年1月1日腾讯停止了webqq机器人的服务支持...
- 5555~面吸多久才能看到效果,面吸后多久能消肿,心急啊
- 比较出名的人工智能模型有哪些
- 使用计算机来进行翻译属于计算机,【判断题】【判断题】遇到诈骗案件时,只要最后一个关口也就是汇款的那一关节守牢就不会有问题。()...