【学习OpenCV4】OpenCV边缘检测算法总结

article/2025/9/15 11:28:53

本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下:

1章 OpenCV快速入门;
第2章 图像读写模块imgcodecs;
第3章 核心库模块core;
第4章 图像处理模块imgproc(一);
第5章 图像处理模块imgproc(二);
第6章 可视化模块highgui;
第7章 视频处理模块videoio;
第8章 视频分析模块video;
第9章 照片处理模块photo;
第102D特征模块features2d;
第11章 相机标定与三维重建模块calib3d;
第12章 传统目标检测模块objdetect;
第13章 机器学习模块ml;
第14章 深度神经网络模块dnn

欢迎关注图书《深度学习计算机视觉实战》与《学习OpenCV4:基于Python的算法实战》。

在这里插入图片描述

边缘是图像中非常重要的特征,在图像识别、目标检测等领域发挥着重要的作用。OpenCV封装了常用的边缘检测算法,如Sobel,Scharr,Laplacian和Canny边缘检测算法,本节介绍这些算法的使用方法。

4.7.1 案例44:Sobel边缘检测

OpenCV中提供了Sobel边缘检测的函数Sobel,函数定义如下:

dst = Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None)

参数说明如下:
src,输入图像;
ddepth,输出图像的深度,若设置为-1,则深度与输入图像深度相同;
dx,计算x方向导数;
dy,计算y方向导数;
dst,输出图像(返回值);
ksize,核的大小;
scale,梯度计算结果的放大比例;
delta,图像存储前可以将像素值增加delta数值,默认为0;
borderType,边界模式,由BorderTypes定义(见3.4.5节)。
本案例调用Sobel函数进行边缘检测分为了三步,第一步计算x方向的边缘,第二步计算y方向边缘,第三步将x和y方向的边缘叠加形成图像的边缘。
本案例使用的输入图像为图3.10,案例代码如下:

import cv2src = cv2.imread("src.jpg")
#高斯滤波
src = cv2.GaussianBlur(src, (3, 3), 0)
#转为灰度图
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#求x方向边缘
sobel_gradx = cv2.Sobel(gray, -1, 1, 0)
#求y方向边缘
sobel_grady = cv2.Sobel(gray, -1, 0, 1)
#边缘合并
sobel_grad = cv2.addWeighted(sobel_gradx, 0.5, sobel_grady, 0.5, 0)#图像显示
cv2.imshow("sobel_gradx", sobel_gradx)
cv2.imshow("sobel_grady", sobel_grady)
cv2.imshow("sobel_grad", sobel_grad)
cv2.waitKey(0)
cv2.destroyAllWindows()

计算x方向的边缘结果如图4.23所示。
在这里插入图片描述

图4.23
计算y方向的边缘结果如图4.24所示。
在这里插入图片描述

图4.24
合并后的边缘结果如图4.25所示。
在这里插入图片描述

图4.25
Sobel边缘检测时也可以同时计算x和y方向上的边缘,即将dx和dy同时设置为1,案例代码如下:

import cv2src = cv2.imread("src.jpg")
#高斯滤波
src = cv2.GaussianBlur(src, (3, 3), 0)
#转为灰度图
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#Sobel边缘检测,同时计算x和y方向的边缘
sobel_grad = cv2.Sobel(gray, -1, 1, 1)
cv2.imshow("sobel_grad", sobel_grad)
cv2.waitKey(0)
cv2.destroyAllWindows()

计算结果如图4.26所示。
在这里插入图片描述

图4.26

4.7.2 案例45:Scharr边缘检测

Sobel算法边缘检测不是很精准,另外一种对Sobel算法改进的算法为Scharr算法,该算法精度比Sobel算法高且检测速度相当。
OpenCV中提供了Scharr边缘检测的函数Scharr,函数定义如下:

dst = Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None)

参数说明如下:
src,输入图像;
ddepth,输出图像的深度,若设置为-1,则深度与输入图像深度相同;
dx,计算x方向导数;
dy,计算y方向导数;
dst,输出图像(返回值);
scale,梯度计算结果的放大比例;
delta,图像存储前可以将像素值增加delta数值,默认为0;
borderType,边界模式,由BorderTypes定义(见3.4.5节)。
Scharr算法的核大小为3,所以和Sobel函数相比,不用设置ksize,其他参数均相同。本案例调用Scharr函数进行边缘检测同样分为了三步,第一步计算x方向的边缘,第二步计算y方向边缘,第三步将x和y方向的边缘叠加形成图像的边缘。
案例代码如下:

import cv2src = cv2.imread("src.jpg")
#高斯滤波
src = cv2.GaussianBlur(src, (3, 3), 0)
#转为灰度图
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)#求x方向边缘
scharr_gradx = cv2.Scharr(gray, -1, 1, 0)
#求y方向边缘
scharr_grady = cv2.Scharr(gray, -1, 0, 1)
#边缘合并
scharr_grad = cv2.addWeighted(scharr_gradx, 0.5, scharr_grady, 0.5, 0)#图像显示
cv2.imshow("scharr_gradx", scharr_gradx)
cv2.imshow("scharr_grady", scharr_grady)
cv2.imshow("scharr_grad", scharr_grad)
cv2.waitKey(0)
cv2.destroyAllWindows()

计算x方向边缘结果如图4.27所示。
在这里插入图片描述

图4.27
计算y方向边缘结果如图4.28所示。
在这里插入图片描述

图4.28
边缘合并的结果如图4.29所示。
在这里插入图片描述

图4.29

4.7.3 案例46:Laplacian边缘检测

Sobel边缘检测计算的时一阶梯度,而Laplacian边缘检测计算的则是二阶梯度,OpenCV中提供了Laplacian边缘检测的函数Laplacian,函数定义如下:

dst = Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None)

参数说明如下:
src,输入图像;
ddepth,输出图像的深度,若设置为-1,则深度与输入图像深度相同;
dst,输出图像(返回值);
ksize,用于计算二阶导数滤波器的核大小;
scale,梯度计算结果的放大比例;
delta,图像存储前可以将像素值增加delta数值,默认为0;
borderType,边界模式,由BorderTypes定义(见3.4.5节)。
Laplacian边缘检测的案例代码如下:

import cv2src = cv2.imread("src.jpg")
#高斯滤波
src = cv2.GaussianBlur(src, (3, 3), 0)
#转为灰度图
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#Laplacian边缘检测
laplacian_grad = cv2.Laplacian(gray, -1)
#图像显示
cv2.imshow("laplacian_grad", laplacian_grad)
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测结果如图4.30所示。
在这里插入图片描述

图4.30

4.7.4 案例47:Canny边缘检测

Canny边缘检测算法是传统图像处理边缘检测中效果较好的算法,该算法先计算x和y方向的一阶导数,然后由它们组合为四个方向导数,而方向导数则是(局部最大值的点)组成边缘的候选项。Canny算法中采用了两个阈值,如果像素的梯度大于较大阈值则接受其为轮廓,如果小于较小值则舍弃,介于阈值之间的如果连接到高于阈值的像素则接受,否则就舍弃,算法建议的阈值介于2:1与3:1之间。OpenCV中提供了Canny边缘检测的函数Canny,函数定义如下:
edges = Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)
参数说明如下:
image,输入图像;
threshold1,阈值1;
threshold2,阈值2;
edges,输出的边缘图像(返回值);
apertureSize,Sobel核大小;
L2gradient,是否使用L2梯度。

Canny边缘检测的案例代码如下:
import cv2

src = cv2.imread(“src.jpg”)
#高斯滤波
src = cv2.GaussianBlur(src, (3, 3), 0)
#转为灰度图
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#Canny边缘检测
canny_grad = cv2.Canny(gray, 70, 160)
#图像显示
cv2.imshow(“canny_grad”, canny_grad)
cv2.waitKey(0)
cv2.destroyAllWindows()
边缘检测的结果如图4.31所示。
在这里插入图片描述

图4.31


http://chatgpt.dhexx.cn/article/Ed79WmQI.shtml

相关文章

Opencv边缘检测、轮廓发现、绘制轮廓

Opencv边缘检测、轮廓发现、绘制轮廓 提取图像轮廓的2个步骤 1、 findContours函数找轮廓, 2、 drawContours函数画轮廓 轮廓的查找——cv::findContours() 函数cv::findContour是从二值图像中来计算轮廓的,它可以使用cv::Canny()函数处理的图像&am…

基于Python的Opencv边缘检测

边缘检测实际上就是对图像进行系统的梯度计算,包含了图像的噪声处理,非极大值抑制,双阈值检测等一系列图像处理方式,通过这些方式处理图像后得到图像的轮廓。这些方式在之前的博客都已经提到过i了,而Opencv提供了一个非…

OpenCV 边缘检测

一. 实验内容 用OpenCV对图片进行边缘检测。 二. 实验代码 //边缘检测 class Task17 { public:void deal() {Mat src_img imread("img\\1.jpg");imshow("边缘检测[原图]", src_img);Mat gray_img;cvtColor(src_img, gray_img, COLOR_BGR2GRAY);Mat out…

java-opencv边缘检测

安装opencv 导入jar包需要dll jar包在opencv\build\java目录里,dll文件在opencv\build\java\64x目录里 边缘检测 package opencv;import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc…

python opencv边缘检测

通过Opencv进行边缘检测可以说是十分常见了,接下来让我们聊一聊如何通过python opencv一步一步实现边缘检测 重要函数讲解 图片读取函数: pic cv2.imread(file_path, flagNone) 参数: file_path:读取的图片的路径。这里要注意如果图像不能读取(由于…

python-opencv边缘检测

9.python-opencv边缘检测 第一章 python-opencv-图片导入和显示 第二章 python-opencv图像简单处理 第三章 python-opencv图像mask掩膜处理 第四章 python-opencv图像马赛克 第五章 python-opencv人脸马赛克 第六章 python-opencv人脸检测 第七章 python-opencv图像张贴 第八章…

opencv边缘检测

边缘检测的一般步骤 滤波 边缘检测的算法对噪声很敏感,所以采用滤波器来改善边缘检测器的性能。 增强 增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度…

14---OpenCV:图像检测之边缘检测

一、图像边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征和形状特征等图像分析的重要基础。图像强度的显著变化可分为: 阶跃变化函数,即图像强度在…

OpenCV学习11_边缘检测

本部分,我们将一起学习OpenCV中边缘检测的各种算子和滤波器-Canny算子、Sobel算子、Laplacian算子以及Scharr滤波器。 一、边缘检测步骤 在具体介绍之前,先来一起看看边缘检测的一般步骤。 1.【第一步】滤波 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪…

opencv--边缘检测

opencv--边缘检测 1 边缘检测原理2 Sobel检测算子2.1 Sobel检测方法2.2 应用 3 Laplacian算子4. Canny边缘检测4.1 原理4.2应用 5 算子比较 1 边缘检测原理 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性…

【OpenCV--边缘检测】

目录 一、边缘检测概念 二、Sobel算子 1.描述: 2.方法: 3.Sobel算子的应用: 三、Laplacian算子 1.描述: 2.应用: 四、Canny边缘检测 1.原理: 2.应用: 一、边缘检测概念 1.边缘检测是图像处理和…

利用OpenCV进行边缘检测

简 介: 本文讨论了图像处理中重要的技术:边缘检测,重点介绍了两种方法(Sobel边缘检测和Canny边缘检测)。在展示OpenCV中的用法 同时也强调了为什么图像平滑是重要的预处理步骤。在Canny边缘检测中 也是使用的Sobel算子…

微信小程序实现轮播图根据图片大小自适应高度

上效果图 话不多说——————上代码 首先wxml <swiper class"con_img" style"height:{{swiperheight}}px" indicator-dots"true" autoplay"true" indicator-active-color"#f8e112" bindchange"changeheight&quo…

微信小程序-图片自适应

image组件 使用使用mode&#xff1a;widthFix&#xff0c;宽度固定&#xff0c;高度自适应 <image class"nav_img" mode"widthFix" src"{{img}}"></image> 注意&#xff0c;在初次进入页面时会有高度拉伸情况&#xff0c;使用样式…

小程序中图片宽度实现100%,高度自适应

在做轮播图时放了几个图片&#xff0c;但是显示一直怪怪的&#xff0c;宽度没有占满&#xff0c;右边总是留一大块空白&#xff0c;怪难看的&#xff0c;开始试了所有的mode属性都不行&#xff0c;至于mode属性起什么作用可以查一下小程序组件的API说明&#xff0c;主要用于控制…

微信小程序之swiper组件高度自适应

要求&#xff1a; &#xff08;顶部广告栏 &#xff09; 改变swiper组件的固定高度&#xff0c;使之随内部每张图片的高度做自适应 原理&#xff1a; 图片加载完之后&#xff0c;获取图片的原始宽高&#xff0c;根据宽高比&#xff0c;计算出适应后的宽高&#xff0c;如果是适…

微信小程序图片固定宽度,高度自适应处理方法及相关API介绍

微信小程序图片固定宽度&#xff0c;高度自适应处理方法及相关API介绍 1、背景 在我们写js代码时&#xff0c;控制图片固定宽度固定&#xff0c;使得高度自适应缩小&#xff0c;是非常简单的&#xff0c;但在微信小程序中不了解微信小程中组件image相关的属性是有些麻烦的&am…

html微信图片自适应,微信小程序实现图片高度自适应

1. swiper轮播海报通过wx.getSystemInfo接口获取屏幕高度&#xff0c;高度依据图片宽高等比缩放 运行于app.js&#xff0c;全局保存 // 设备信息 wx.getSystemInfo({ success: function(res) { that.screenWidth res.windowWidth; } }); page前端调用 bannerHeight: Math.ceil…

微信小程序的swiper轮播图中的图片设置自适应高度的一种方法

微信小程序的swiper轮播图中的图片设置自适应高度的一种方法 小程序中的轮播图很简单&#xff0c;但是唯一的缺陷就是 swiper 是固定的150px 高度&#xff08;320px 宽度&#xff09;&#xff0c;这样如果传入的图片大于这个高度就会被隐藏。那么如何让图片自适应不同分辨率是一…

【小程序中image自适应以及默认高度问题】

原因&#xff1a;小程序不知道background-image&#xff0c;本人开发小程序有个头图&#xff0c;根据天气展示不同的头图&#xff0c;要适配各种宽窄不同的屏幕以及Ipad&#xff0c;不能拉伸图片&#xff0c;UI不同意使用渐变&#xff0c;其实使用宽100%完全可以解决&#xff0…