【图像处理】canny和sobel边缘检测__python-opencv
目录
边缘检测
边缘检测:边缘检测指的是灰度发生剧烈变化的位置,边缘检测的目的是制作一个线图,在不会损害图像内容的情况下,大大减少图像的数据量,提供对图像数据的合适概述。
Sobel算子
其中Gx表示x方向的Sobel算子,用于检测y方向的边缘; Gy表示y方向的Sobel算子,用于检测x方向的边缘(边缘方向和梯度方向垂直)。
原型
Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中,使用Sobel的算子的函数原型如下:
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
参数:
第一个参数是需要处理的图像;
第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
代码
import os
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('./image/lena_50.jpg') # 读取图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图
blur = cv2.GaussianBlur(img_gray, (3, 3), 0) # 高斯滤波处理原图像降噪x = cv2.Sobel(blur, cv2.CV_16S, 1, 0) # Sobel函数求完导数后会有负值,还有会大于255的值
y = cv2.Sobel(blur, cv2.CV_16S, 0, 1) # 使用16位有符号的数据类型,即cv2.CV_16S
Scale_absX = cv2.convertScaleAbs(x) # 转回uint8
Scale_absY = cv2.convertScaleAbs(y)
sobel_image = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
cv2.imshow('lena_50', img)
# cv2.imshow("absX_process", Scale_absX)
# cv2.imshow("absY_process", Scale_absY)
cv2.imshow('sobel_xy_process', sobel_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍中有这么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。
在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像,而只是一副灰色的窗口。convertScaleAbs()的原型为:
结果
原图:
Sobel算子处理后得到图像:
canny算子
流程
Canny边缘检测算法可以分为以下5个步骤:
- 使用高斯滤波器,以平滑图像,滤除噪声。
- 计算图像中每个像素点的梯度强度和方向。
- 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
- 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
- 通过抑制孤立的弱边缘最终完成边缘检测。
具体原理细节可参考:边缘检测之Canny
原型
canny = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
参数:
第一个参数 处理的原图像,该图像必须为单通道的灰度图;
第二个参数 最小阈值;
第三个参数 最大阈值。
代码
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('./image/lena_50.jpg') # 读取图像img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图
blur = cv2.GaussianBlur(img_gray, (3, 3), 0) # 高斯滤波处理原图像降噪canny_image = cv2.Canny(blur, 50, 150)
cv2.imwrite('./image/canny_image.jpg', canny_image)
cv2.imshow('lena_50', img)
cv2.imshow('canny_process', canny_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果
原图:
Sobel算子处理后得到图像:
【图像处理】canny和sobel边缘检测__python-opencv相关推荐
- 图像处理——Canny算子 图像边缘检测:Canny算子、Prewitt算子和sobel算子
https://blog.csdn.net/fengye2two/article/details/79190759 https://www.jianshu.com/p/bed4ffe996a1
- 图像处理3:Sobel边缘检测
前言 软件版本 vivado :2020.1 Quartus :17.1 正文 边缘检测需要用到的IP核在两款软件中是不一样的 因此,下面分别在两款软件中进行实现 一.在vivado中实现 1.算法流 ...
- 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- OpenCV探索之路(五):图像变换——边缘检测(canny、sobel、laplacian)
前言 边缘检测的一般步骤: 滤波--消除噪声 增强--使边界轮廓更加明显 检测--选出边缘点 一.Canny算法 Canny边缘检测算法被很多人推崇为当今最优秀的边缘检测算法,所以我们第一个就介绍他. ...
- [图像处理]-Canny边缘检测算法
1.问题描述 在处理图像时,有时我们需要图像的边界或通过边界得到一定的信息,如何有效而准确的找到这些边界并显示出来就了一个问题,而Canny算法则可以很好的解决它. 2.简述Canny算法 Canny ...
- Opencv 笔记5 边缘处理-canny、sobel、Laplacian、Prewitt
一.边缘检测概述 边缘检测是计算视觉中的基本问题,边缘检测的目的是标识图像中亮度变换明显的点.边缘检测大幅度的减少了图像的数据量(分为两种:灰度图像边缘检测和彩色图像边缘检测),并且剔除了不相关的信息 ...
- 图像处理2:图像边缘检测(python+opencv)
边缘的定义及分类 1.梯度滤波器 OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel, Scharr 和 Laplacian.Sobel,Scharr 其实就是求一阶或二阶导数.S ...
- OpenCV Sobel 边缘检测
Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...
- OpenCV入门系列 —— Sobel边缘检测
OpenCV入门系列 -- Sobel边缘检测 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别.定位 ...
最新文章
- SQL Server 2005实现负载均衡的详细介绍
- vue 去除路由时候的#
- 2015#183;Fool#39;s Day#183;NND
- pythonxml模块高级用法_Python利用ElementTree模块处理XML的方法详解
- 二级计算机access押题,全国计算机等级考试标准教程:二级Access
- ALC--软件定义架构的PLC
- 【Flink】FileNotFoundException: JAR file does not exist: -ynm -yst
- 报告:2020年NFT总市值达5200万美元
- 元月份退休能享受涨养老金的待遇吗?
- GIS案例练习-----------第八天
- 【手把手教你】使用pyfinance进行证券收益分析
- 基于3DGIS+BIM的智慧园区运维管理平台
- “电脑族”保健六项注意
- Python进行网页自动打卡系统
- k8s ipvs模式下vip nodeport规则未创建原因分析
- GroupDocs.Conversion Crack,强大 .NET 文档转换组件
- IDEA的Project与Structure依赖jar包的方式
- 【190319】VC++ C/S结构视频聊天软件源码源代码
- 面试中自我介绍的小技巧
- sqli-labs靶场通关(Less1-4)