首页 > 其他分享 >opencv 边缘检测-拉普拉斯算子

opencv 边缘检测-拉普拉斯算子

时间:2024-08-05 16:53:04浏览次数:16  
标签:src 导数 拉普拉斯 filter 二阶 opencv ksize 算子 cv

索贝尔算子是模拟一阶求导,导数越大的地方说明变换越剧烈,越有可能是边缘.
在这里插入图片描述

那如果继续对f’(t)求导呢?
在这里插入图片描述

可以发现"边缘处"的二阶导数=0. 我们可以利用这一特性去寻找图像的边缘. 注意有一个问题,二阶求导为0的位置也可能是无意义的位置

拉普拉斯算子推导过程

在这里插入图片描述

以x方向求解为例:
一阶差分:f’(x) = f(x) - f(x - 1)
二阶差分:f’‘(x) = f’(x+1) - f’(x) = (f(x + 1) - f(x)) - (f(x) - f(x - 1))
化简后:f’'(x) = f(x - 1) - 2 f(x)) + f(x + 1)
提取前面的系数:[1, -2, 1]

同理得到y方向的系数[1,-2,1]

这样的话,叠加起来就得到了拉普拉斯矩阵
在这里插入图片描述

opencv实现
Laplacian api
在这里插入图片描述

默认的ksize=1,和ksize=3效果是一样的,都是用的上述拉普拉斯矩阵去卷积原图像

关于filter具体是什么,可以通过函数getDerivKernels得到
在这里插入图片描述

dx,dy代表求导的阶数.

def cal_filter(dx,dy,ksize):
    kx, ky=cv.getDerivKernels(dx, dy, ksize)
    print(kx)
    print(ky)
                                                                  
cal_filter(2,2,1)   
cal_filter(2,2,3) 
cal_filter(2,2,5)

在这里插入图片描述

输出为
可以看到ksize=1和ksize=3其实是一样的.

import cv2 as cv
def test():
    src = cv.imread("/home/sc/disk/keepgoing/opencv_test/sidetest.jpeg")
    src = cv.GaussianBlur(src, (3, 3), 0)
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

dst1 = cv.Laplacian(gray, -1,3)
dst2 = cv.Laplacian(gray, -1,1)

cv.imshow("origin",src)
cv.imshow("dst1",dst1)
cv.imshow("dst2",dst2)
if 27 == cv.waitKey():
    cv.destroyAllWindows()

test()
效果如下:
在这里插入图片描述

sobel和laplace都是比较简单的边缘检测算法,目前比较常用的是canny,后面的博文会写到.
在搜索各种边缘检测算法的适用场景时,发现大部分文章都只讲了opencv里如何实现,并且都是互相抄来抄去.

二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作

总结一下就是:拉普拉斯对噪声更敏感,但是对边缘灰度变化不大的图像,检测效果比索贝尔算子要好一些.比如下图中牛和树的灰度变换并不是特别强.

在这里插入图片描述
在这里插入图片描述

标签:src,导数,拉普拉斯,filter,二阶,opencv,ksize,算子,cv
From: https://blog.csdn.net/m0_37302966/article/details/140815314

相关文章

  • SciTech-BigDataAI-ImageProcessing-OpenCV-OpenCV modules
    OpenCVmoduleshttps://docs.opencv.org/3.4/IntroductionOpenCVTutorialsOpenCV-PythonTutorialsOpenCV.jsTutorialsTutorialsforcontribmodulesFrequentlyAskedQuestionsBibliographyMainmodules:core.Corefunctionalityimgproc.ImageProcessingim......
  • SciTech-BigDataAI-ImageProcessing-OpenCV-Splitting and Merging Channels with Ope
    Links:https://pyimagesearch.com/2021/01/23/splitting-and-merging-channels-with-opencv/OpenCVOfficial:https://docs.opencv.org/3.4/d3/df2/tutorial_py_basic_ops.htmlSplittingandMergingImageChannelsSometimesyouwillneedtoworkseparatelyonth......
  • 使用 Sobel 算子理解梯度组合策略输出
    我尝试实现一个SobelEdge检测器,如下所示:defsobel(img):img=cv2.GaussianBlur(img,(5,5),0)filter_x=np.array([[-1,0,1],[-2,0,2],[-1,0,1]])filter_y=np.array([[-1,-2,-1],......
  • 【Spark计算引擎----第二篇(RDD):一篇文章带你清楚什么是RDD?RDD的概念,RDD的特性,怎么创建
    前言:......
  • 基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理
    1.TCP/IP编程1.1概念IP是英文InternetProtocol(网络之间互连的协议)的缩写,也就是为计算机网络相互连接进行通信而设计的协议。任一系统,只要遵守IP协议就可以与因特网互连互通。所谓IP地址就是给每个遵循tcp/ip协议连接在Internet上的主机分配的一个32bit地址。按照TC......
  • Linux下安装OpenCV
    安装先安装依赖库:sudoapt-getinstallbuild-essentiallibgtk2.0-devlibgtk-3-devlibavcodec-devlibavformat-devlibjpeg-devlibswscale-devlibtiff5-dev根据官网教程进行安装:OpenCVGetStartedOperatingSystem:LinuxBuildingFromSource:YesLanguage:C++O......
  • OpenCV计算机视觉学习(16)——仿射变换学习笔记
    如果需要其他图像处理的文章及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice在计算机视觉和图像处理中,仿射变换是一种重要的几何变换方法。它可以通过线性变换和平移来改变图像的形状和位置,广泛应......
  • 1、 window平台opencv下载编译, 基于cmake和QT工具链
    1.环境准备,源码下载1.1前置环境qt下载安装cmake安装,可参考:https://blog.csdn.net/qq_51355375/article/details/1391866811.2opencv源码下载官网地址:https://opencv.org/releases/下载源码:2.opencv编译这里使用cmakegui图形化配置,操作简答些。2.1源......
  • OpenCV||超细节的基本操作
    一、图像读取retval=cv2.imread(filename[,flags])filename:需要读取的图片路径名,支持多种图片格式,如JPEG、PNG、TIFF等。flags:一个可选参数,指定加载图像的颜色类型。常用的值包括:cv2.IMGEAD_ANYDEPTH:其值是2。若载入的图像深度为16位或32位,就返回对应深度的图像,否则转......
  • OpenCV||超详细的图像平滑
    消除噪声的工作称为图像平滑平滑处理算法:基于二维离散卷积的高斯平滑、均值平滑;基于统计学方法的中值平滑;具备保持边缘作用的双边滤波、导向滤波。平滑滤波算法:线性平滑、非线性平滑、自适应平滑一、线性滤波1.1归一化方框滤波器概述:归一化方框滤波器,也被称为均值滤波......