OpenCV(五)之图像边缘检测

从图像处理到深度学习,带你实现OpenCV实战 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的C函数和少量C++类构成,同时提供Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。# 导入OpenCV库import cv2# 打印OpenCV版本4.5.2OpenCV的设计目标是提供一套简单而且可扩展的计算机视觉库,使得它能够方便地在实际的应用、研究、开发中被使用。 阅读详情

Edge detection系列之Canny边缘检测

理论:
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
(1)最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
(2)最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
(3)检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。
为了满足这些要求 Canny 使用了变分法(calculus of variations),这是一种寻找优化特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数。

步骤:
Canny边缘检测算法可以分为以下5个步骤:
1.应用高斯滤波来平滑图像,目的是去除噪声
2.找寻图像的强度梯度(intensity gradients)
3.应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)
4.应用双阈值的方法来决定可能的(潜在的)边界
5.利用滞后技术来跟踪边界


Edge detection-高斯滤波

在之前的学习中,知道:图像的噪声,会影响到图像的处理,例如在本节中要做的边缘检测,需要计算每个像素点的梯度强度和方向,需要用高斯滤波做一次图像的平滑处理。

滤波操作-高斯滤波
function
def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None):
    使用高斯滤波器平滑图像。
	该函数将源图像与指定的高斯内核进行卷积,支持就地过滤。
	
	参数
	SRC	输入图像; 图像可以有任意数量的通道,这些通道是独立处理的,但深度应该是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
	DST	输出与src相同大小和类型的图像。
	ksize	高斯核大小。ksize.width和ksize.height可以不同,但​​它们都必须为正数且为奇。
			或者,它们可以是零,然后它们是从sigma计算得到。
	sigmaX	X方向的高斯核标准偏差。
	sigmaY	Y方向的高斯核标准偏差; 如果sigmaY为零,则将其设置为等于sigmaX;
			如果两个sigma均为零,则分别从ksize.width和ksize.height计算(详见cv :: getGaussianKernel);
			为了完全控制结果,无论将来可能修改所有这些语义,建议指定所有ksize,sigmaX和sigmaY。
	borderType   像素外推法,参见cv :: BorderTypes

滤波操作-高斯内核-getGaussianKernel()
function
def getGaussianKernel(ksize, sigma, ktype=None):

返回高斯滤波器系数。
该函数计算并返回高斯滤波器系数的?????×1矩阵:

getGaussianKernel

其中两个生成的内核可以传递给sepFilter2D。 
这些函数自动识别平滑内核(一个权重总和等于1的对称内核)并相应地处理它们。 您也可以使用更高级别的GaussianBlur。

Edge detection-Sobel算子

用Sobel算子来计算图像中每个像素点的梯度强度和方向。

梯度计算-梯度强度
function:
def Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None):
	使用扩展的Sobel算子计算第一,第二,第三或混合图像导数。
	在除1之外的所有情况下,使用?????×?????可分内核来计算导数。
	当?????=?时,使用3×1或1×3内核(即不进行高斯平滑),ksize = 1时只能用于第一个或第二个x或y衍生物。
	还有特殊值ksize = CV_SCHARR(-1),它对应于3×3 Scharr滤波器,可以提供比3×3 Sobel更准确的结果。
	Scharr aperture 是:

Scharr aperture

	对于x-导数,或对y-导数进行转置。
	该函数通过将图像与适当的内核进行卷积来计算图像导数:

dst

	Sobel算子结合了高斯平滑和微分,因此结果或多或少地抵抗噪声。 
	大多数情况下,使用(xorder = 1,yorder = 0,ksize = 3)或(xorder = 0,yorder = 1,ksize = 3),
	调用函数以计算第一个x或y图像导数。 
	第一种情况对应于以下内核:

kernel

	第二种情况对应于以下内核:

kernel

	参数
	SRC	输入图像。
	DST	输出与src相同大小和相同通道数的图像。
	ddepth	输出图像深度,见#combinations ; 在8位输入图像的情况下,它将导致截断的导数。
	DX	导数x的顺序。
	DY	导数y的顺序。
	ksize	扩展的Sobel内核的大小; 它必须是1,3,5或7。
	scale	计算导数值的可选比例因子; 默认情况下,不应用缩放(有关详细信息,请参阅# getDerivKernels)。
	delta	在将结果存储在dst之前添加到结果中的可选delta值。
	borderType	像素外推法,参见#BorderTypes

梯度计算-梯度方向

用Sobel算子得到相对应的X,Y方向之后,计算其梯度方向,其中G表示梯度的方向,则G的计算公式为:
G = G x 2 + G y 2 G = \sqrt {G_x^2+G_y^2} G=Gx2​+Gy2​ ​
θ = arctan ⁡ ( G y G x ) \theta = \arctan (\frac{G_y}{G_x}) θ=arctan(Gx​Gy​​)


Edge detection-非极大值抑制

应用非极大值抑制,以消除边缘检测带来的杂散响应,在应用Sobel算子计算得到像素点的梯度强度和方向后,要突出显示“边界值”最为明显的,这一步的目的是将模糊(blurred)的边界变得清晰(sharp)。

通俗的讲,就是保留了每个像素点上梯度强度的极大值,而删掉其他的值。

非极大值抑制-线性插值法

非极大值抑制-近似方向

对于每个像素点,进行如下操作:
a) 将其梯度方向近似为以下值中的一个(0,45,90,135,180,225,270,315)(即上下左右和45度方向,共8个方向)
b) 比较该像素点,和其梯度方向正负方向的像素点的梯度强度
c) 如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)

为了更好的解释这个概念,看下图。
describe
图中的数字代表了像素点的梯度强度,箭头方向代表了梯度方向。以第二排第三个像素点为例,由于梯度方向向上,则将这一点的强度(7)与其上下两个像素点的强度(5和4)比较,由于这一点强度最大,则保留。

可以想象,边界处的梯度方向总是指向垂直于边界的方向,即最后会保留一条边界处最亮的一条细线。


Edge detection-双阈值检测

应用双阈值检测来确定真实的和潜在的边缘,再对边缘值进行一次区间筛选。

经过非极大抑制后图像中仍然有很多噪声点。Canny算法中应用了一种叫双阈值的技术。即设定一个阈值上界和阈值下界(opencv中通常由人为指定的),图像中的像素点如果大于阈值上界则认为必然是边界(称为强边界,strong edge),小于阈值下界则认为必然不是边界,两者之间的则认为是候选项(称为弱边界,weak edge),需进行进一步处理。
double_threshold

比较边界舍弃
梯度值>maxVal是否
minVal<梯度值<maxVal是否
梯度值<maxVal否是

Edge detection-边界跟踪

和强边界相连的弱边界认为是边界,其他的弱边界则被抑制。
较高的亮度梯度比较有可能是边缘,但是没有一个确切的值来限定多大的亮度梯度是边缘多大又不是,所以 Canny 使用了滞后阈值。

滞后阈值(Hysteresis thresholding)需要两个阈值,即高阈值与低阈值。假设图像中的重要边缘都是连续的曲线,这样我们就可以跟踪给定曲线中模糊的部分,并且避免将没有组成曲线 的噪声像素当成边缘。所以我们从一个较大的阈值开始,这将标识出我们比较确信的真实边缘,使用前面导出的方向信息,我们从这些真正的边缘开始在图像中跟踪 整个的边缘。在跟踪的时候,我们使用一个较小的阈值,这样就可以跟踪曲线的模糊部分直到我们回到起点。

一旦这个过程完成,我们就得到了一个二值图像,每点表示是否是一个边缘点。

一个获得亚像素精度边缘的改进实现是在梯度方向检测二阶方向导数的过零点,它在梯度方向的三阶方向导数满足符号条件。
滞后阈值也可以用于亚像素边缘检测。


Edge detection-Canny函数

function:
def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None):
	使用Canny算法在图像中查找边缘。
	该函数在输入图像图像中查找边缘,并使用Canny算法在输出图像边缘标记它们。
	threshold1和threshold2之间的最小值用于边缘链接,最大值用于查找强边的初始段。
	
	参数
	image	输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
	threshold1	第一个阈值
	threshold2	第二个阈值
	edges	输出的边缘图像 ,也是单通道的,但是是黑白的
	apertureSize	Sobel算子内核大小
	L2gradient	一个标志,表示更准确的L2范数为:

L 2 = ( d I d x 2 ) + ( d I d y 2 ) L_2=\sqrt {(\frac{dI}{dx}^2)+(\frac{dI}{dy}^2)} L2​=(dxdI​2)+(dydI​2) ​

	应该用来计算图像梯度幅度(L2gradient = true),或者是否默认为L1范数:

L 1 = ∣ d I d x ∣ + ∣ d I d y ∣ L_1 = |\frac{dI}{dx}|+|\frac{dI}{dy}| L1​=∣dxdI​∣+∣dydI​∣

	就够了(L2gradient = false)。

代码实现:

#导入工具包
import cv2
import numpy as np

#定义一个函数,用来输出图像
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
#读取一张图像(灰度图)
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show('img',img)

output

v1 = cv2.Canny(img,80,150) #在双阈值检测中设置为80和150,初始阈值较大,会使细节强化
v2 = cv2.Canny(img,50,100) #在双阈值检测中设置为50和100,初始阈值较小,检测越多边界
res = np.hstack((v1,v2))
cv_show('res',res)

v1 2 v2

#再导入一张图像,做比较
img = cv2.imread('car.png',cv2.IMREAD_GRAYSCALE)
v1 = cv2.Canny(img,80,150) #在双阈值检测中设置为80和150,初始阈值较大,会使细节强化
v2 = cv2.Canny(img,50,100) #在双阈值检测中设置为50和100,初始阈值较小,检测越多边界
res = np.hstack((v1,v2))
cv_show('res',res)

v1 2 v2


结论:

当双阈值的minVal越小,检测到越多的边缘,或者说过滤留下更多边缘,能看到更多疑似边缘信息(包括噪音)
当双阈值的minVal越大,检测到越少的边缘,或者说过滤舍弃更多边缘,能看到边缘的细节强化


END

OpenCV——边缘保留滤波EPF(Edge Preserve Filter) 原图像: pymeanshift结果: bilateralfilter结果: 代码部分: import numpy as np import cv2 as cv def bilateral_filter(image): # 高斯双边——边缘保留滤波 # bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is # . v 阅读详情

相关推荐

opencv图像形态学(边缘检测算法实例)

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

2401_84670644的博客 4985

图像查看器软件—"EdgeView 2"

EdgeView 2是一款体积小,重量轻但功能强大且速度快的图像查看器。用户可以在内置文件浏览器中快速查找文件,并在查看器窗口中打开它。EdgeView 2可以打开大多数图像文件格式,以及压缩文件,如zip,rar和7-zip。您也可以通过连接到FTP服务器直接打开FTP文件。功能特色EdgeView 2是国家的最先进的图像查看器,MacOS X上工作图像查看器EdgeVie...

weixin_34128839的博客 753

opencv-python学习笔记8-图像边缘检测

在OpenCV中,图像边缘检测是一个重要的图像处理技术,它可以帮助识别图像中的物体边界。降噪:边缘检测容易受到图像噪声的影响,因此通常首先使用高斯滤波器对图像进行平滑处理以减少噪声。求图像的强度梯度:通过应用Sobel算子或其他梯度算子来计算图像的梯度。这通常涉及到计算图像在水平和垂直方向的一阶导数。非极大值抑制:在这一步中,算法会检查图像中的每个像素,并仅保留梯度方向上局部最大值的像素,这样可以细化边缘。双阈值:使用两个阈值来确定强边缘和弱边缘。

The_xz的博客 2649

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

OpenCV:图像检测之边缘检测

zjjaibc的博客 2410

基于OpenCv的图像边缘检测1

边缘主要存在于目标与目标、目标与背景、区域与区域之间,是图像分割、纹理特征和形状特征等图像分析的重要基础。对图像分析和理解的第一步常常是边缘检测。 例如,在人脸检测中,利用边缘检测技术从大量的人脸中找到对应的特征,并通过训练出不同的分类器,如嘴巴分类器、眼睛分类器等,从而实现人脸及关键部位的检测。

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 1505

《OpenCV计算机视觉》—— 图像边缘检测

1.sobel算子、2.Scharr算子、3.Laplacian算子、4.Canny算子

weixin_73504499的博客 2337

android openCV 应用 (五)图像边缘检测

边缘检测的基本思想是利用微分运算(如一阶微分和二阶微分)来捕捉图像灰度值的变化,从而识别出边缘

Seigfrind的博客 1215

Android版OpenCV图像处理技术亲自验证[五]之Canny边缘检测

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样不仅误导初学的一些小伙伴,而且被其他小伙伴转载或者复制之后,会造成更大的影响和后果。正所谓”徒错错一个,师错错一窝。为人师者慎下笔“,故此,本专栏亲自研究,实践,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学OpenCV的小伙伴,避免走弯路,费时费力。

hnjzfwy的博客 354

Python-初学openCV——图像预处理(五)——梯度处理、边缘检测、图像轮廓

还记得高数中的一阶导数求极值吗?把图片想象成连续函数,因为边缘部分的像素值是与旁边像素明显有区别的,所以对图片局部求极值,就可以得到整幅图片的边缘信息了。不过图片是二维的离散函数,导数就变成了差分,这个差分就称为图像的梯度。

bright_colo的博客 1385

edge_new_边缘检测opencv_opencv_自适应阈值

实现opencv的canny算子及其改进,可以自适应生成阈值,包括了几种阈值处理算法

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南

本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。

weixin_42520909的博客 462

OpenCV探索之路(五):图像变换——边缘检测(canny、sobel、laplacian)

前言 边缘检测的一般步骤: 滤波——消除噪声 增强——使边界轮廓更加明显 检测——选出边缘点 一、Canny算法 Canny边缘检测算法被很多人推崇为当今最优秀的边缘检测算法,所以我们第一个就介绍他。 opencv中提供了Canny函数。 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgu...

YBAdiam的博客 829

USB接口ESD防护设计实战:从金属外壳到信号线的完整避坑指南

本文深入探讨USB接口ESD防护设计的实战要点,聚焦金属外壳作为ESD能量泄放关键通道的处理策略。文章详细解析了从外壳接地路径控制、信号线TVS管选型与布局,到PCB分区及电源线滤波等完整设计流程,旨在帮助硬件工程师构建系统级防护,避免常见设计误区,确保产品通过严苛的静电测试。

k8l9m0n的博客 482

OpenCV中的图像处理3.7-3.8(五)边缘检测、图像金字塔

翻译及二次校对:cvtutorials.com编辑者:廿瓶鲸(和鲸社区Siby团队成员)

weixin_64215932的博客 1909

时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API)

STFT function [STFT, f, t] = mystft(x, win, hop, nfft, fs) % function: [STFT, f, t] = stft(x, win, hop, nfft, fs) % % Input: % x - signal in the time domain % win - analysis window function % hop - hop size % nfft - numb

frostime的博客 13万+

别再只调陀螺仪了!用OpenCV实现基于透视变换的EIS防抖,实测效果媲美手机

本文深入探讨了基于透视变换的EIS电子稳像技术,通过OpenCV实现高阶防抖算法,效果媲美主流手机厂商方案。详细解析了传统旋转平移模型的局限性,并展示了透视变换在复杂场景下的优势,包括数学原理、OpenCV实战代码及性能优化技巧,为视频防抖提供了专业解决方案。

weixin_42613501的博客 454

OpenCV-Python图像处理学习笔记(五)——Canny 边缘检测、图像金字塔、轮廓检测(一)

本篇学习笔记主要内容在图像的Canny 边缘检测、图像金字塔、轮廓检测内容。获取更多可以查看本栏目其他文章。

weixin_57726558的博客 2306

多摄像头场景下 ISP 的同步与调度机制实战解析

在智能手机多摄系统中,主摄、广角、长焦、微距等摄像头的协同工作能力直接决定了影像系统的体验上限。而支撑这一能力的核心之一,正是 ISP 的同步与调度机制。ISP 需要处理多个 Sensor 的输入流、统一时序、资源仲裁、并发调度,并支持在不同模式间快速切换(如预览 → 拍照 → 视频)。本文将基于 Qualcomm、MTK、HiSilicon 平台的实际架构,系统性剖析 ISP 在多摄场景下的时序控制、Pipeline 配置、Buffer 管理与故障恢复机制,并分享实战中的典型问题与调试方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2351

OpenCV(五) —— 图像梯度处理 & 边缘检测(Sobel算子 & Scharr算子 & laplacian算子 & Canny算子)

图像梯度处理 图像梯度-Sobel算子 Scharr算子 对变化会比较敏感

hxxjxw的博客 650

2026年3月GESP真题及题解(C++七级):物流网络

2026年3月GESP真题及题解(C++七级):物流网络

王老师青少年编程 1127

SAP-ABAP:字符与数值类型转换详细指南

SAP-ABAP:字符与数值类型转换详细指南

baidu_35680696的博客 1486

Opencv-Canny边缘检测器

Canny边缘检测器知识点python代码c++代码 知识点 Canny边缘检测器 1986年,JOHN CANNY 提出一个很好的边缘检测算法,被称为Canny编边缘检测器。Canny边缘检测器是一种经典的图像边缘检测与提取算法,应用广泛,主要是因为Canny边缘检测具备以下特点: 有效的噪声抑制 更强的完整边缘提取能力 Canny算法是如何做到精准的边缘提取的,主要是靠下面五个步骤 高斯...

weixin_41709536的博客 415

手把手教你学Simulink--复杂环境适应的四足机器人领域仿真建模实例:构建一个基于Simulink的四足机器人动态平衡保持仿真模型

通过上述步骤,你可以构建一个基本的基于Simulink的四足机器人动态平衡保持仿真模型。此模型不仅有助于理解四足机器人在复杂环境中的动态平衡控制原理,也为进一步优化提供了基础。随着技术的发展,还可以探索更多高级功能,如自适应步态调整、强化学习等,以提高机器人的智能性和适应性。

MHD0815的博客 240

OpenCV 基础实战五边缘检测

OpenCV 基础实战五边缘检测 边缘检测主要是识别图像中的色彩(亮度)显著变化的的区域,边缘检测的图像要求是单通道的图像。

cyl190的博客 2230

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔 目录OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔1. 图像梯度1.1 Sobel和Scharr算子1.2 Laplacian算子2. Canny边缘检测2.1 多阶段的Canny边缘检测算法2.2 OpenCV中的Canny Edge检测 1. 图像梯度 首先我们来看看什么是图像梯度:图像梯度可以把图像看作二维离散函数,图像梯度就是这个二维函数的求导,图像边缘一般都是通过对图像进行梯度运算来

小菜鸡的小博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OpenCV 图像处理三(图像梯度--边缘检测【图像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 边缘检测】)

边缘检测并非万能,边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。为了避免信息丢失,推荐使用更高的数据类型来进行计算,例如 cv2.CV_64F,即64位浮点型。这样,计算结果将以浮点数的形式保存,包括负数。然后,可以通过取绝对值或其他操作将其映射为需要的数据类型,例如 cv2.CV_8U,即8位无符号整数。

m0_74154295的博客 4515

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: OpenCV(四)之图像梯度处理
下一篇: OpenCV(六)之图像轮廓检测
DeepLearningJay
博客等级 码龄7年 3064粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值