文章目录

  • Sobel算子
  • Scharr算子
  • Laplacian算子
  • 不同算子直接的比较

Sobel算子

  • 如何理解梯度?
    我们可以把梯度理解为一个图像的边界点。
  • 如何计算梯度,我们可以之前定义kernel函数,对图像中的某一个点进行计算。同时我们还需要计算要从两个方向入手,1:水平计算;2:垂直计算。Sobel算子的计算公式如下如所示:
  • 通过代码及展现形式可以更深入地了解用法:
#dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
#src:图像
#ddepth:图像的深度
#dx和dy分别表示水平和竖直方向
#ksize是Sobel算子的大小def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv_show(sobelx,'sobelx')    

  • 为什么只显示了半边的边界呢?因为白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值。优化代码如下:
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely,'sobely')


  • 计算完x,y之后在进行相加操作:
#这里的0.5表示的是图像的权重,0表示表示的是偏置项,默认为0
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

  • 这里不建议直接计算,这可能导致最后得到的梯度图像效果非常差,如下图所示:
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy,'sobelxy')

  • 实战一下,我继续使用Lena这个图像进行操作。
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

Scharr算子

  • Scharr算子公式如下图所示:
  • 相比较Sobel,Scharr算子距离点近的值很大,而距离较远的值相对较小,整体数值要比Sobel大,最终对计算结果的差异性会更明显。
  • 使用的函数为cv2.Scharr,具体实现与Sobel类似。

Laplacian算子

  • Sobel算子是模拟一阶求导,导数越大的地方说明变换越明显,越有可能是边缘,而Laplacian使用到了二阶导(一阶导的变化率),虽然对于变化更敏感,但是同时会对噪音点也会更加敏感,反而影响了最终结果。所以需要配合其他工具一起使用才能得到更好的效果。
  • Laplacian矩阵公式如下图所示
  • 使用的函数为cv2.Laplacian,这个函数无需考虑到X,Y,用上去更简单了。

不同算子直接的比较

  • 我们继续使用Lena这个图片来进行操作
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(res,'res')

  • 从上面的图片我们可以到,相比于Sobel算子使用Scharr算子可以把本不是特别明显的边界也能展示出来。而拉普拉斯算子就好像有点拉胯了,当然它是需要配合其他工具一起使用的,效果才能更好。

OpenCV计算图像梯度相关推荐

  1. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

  2. 基于OpenCV的图像梯度与边缘检测!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 严格的说,梯度计 ...

  3. python怎么计算图像梯度_opencv python图像梯度实例详解

    这篇文章主要介绍了opencv python图像梯度实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一阶导数与Soble算子 二阶导数与拉普 ...

  4. Python+OpenCV:图像梯度

    Python+OpenCV:图像梯度(Image Gradients) 理论 OpenCV提供了三种类型的梯度滤波器或高通滤波器,Sobel, Scharr和Laplacian. 1. Sobel和S ...

  5. opencv 梯度幅值_基于OpenCV的图像梯度与边缘检测!

    严格的说,梯度计算需要求导数.但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值.图像梯度表示的是图像变化的速度,反映了图像的边缘信息. 边缘是像素值快速变化的地方.所以对于图像的边缘部分,其灰 ...

  6. python图片相似度计算_python Opencv计算图像相似度过程解析

    这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁 ...

  7. OpenCV之图像梯度

    1. Sobel算子 OpenCV系列-本文底页有多个常用方法链接 1.1 Sobel介绍 cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和 ...

  8. python怎么计算图像梯度_Opencv-Python学习笔记十——图像梯度、边缘检测 Gradient, Edge Detection...

    图像梯度 边缘检测 图像梯度,图像边界 使用到的函数有: cv2.Sobel(), cv2.Schar(), cv2.Laplacian() 梯度简单来说就是求导,OpenCV 提供了三种不同的梯度滤 ...

  9. 使用OpenCV计算图像的轮廓矩的代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 轮廓矩用来干嘛?说实话,我是没有找到相关文章专门 ...

最新文章

  1. 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析
  2. 3详细参数_【前沿】一加7Pro拍照详细参数曝光 3倍光变30W快充
  3. python微信开发实例 pdf 百度网盘_用python看女神微信里的百度云资源有啥?
  4. 【CF#192 A】Funky Numbers (二分,查找,二元组)
  5. 软件工程-团队作业1
  6. Latex中将多个eps图片合并成一幅eps的代码和方法
  7. Java根据word模板生成word文件
  8. 1196:踩方格(递推)
  9. Opencv打开basler相机——实现显示视频、保存图片、记录视频(Windows下)
  10. android 布局滑动消失,SlideUp-Android
  11. php-resque 简单的php消息队列
  12. 文件路径问题解决方案
  13. C++中的dynamic_cast和static_cast转化
  14. 【Kubernetes】k8s网络概念和实操详细说明【calico网络】【含docker不同容器网络互通配置,k8s网络互通配置】【1】
  15. could only be written to 0 of the 1 minReplication nodes. There are 0 datanode(s) running and 0 node
  16. 夫琅禾费单缝衍射matlab分析,夫琅禾费单缝衍射光强分析与探讨
  17. F-OFDM 系统简单Matlab搭建
  18. 航班号校验正则表达式
  19. batch-size选取
  20. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day15】—— Spring框架1

热门文章

  1. 【计算机网络面试】tcp/ip协议三次握手、四次挥手
  2. Linux 终极装机指南
  3. 【信息图】iPhone屏幕分辨率终极指南
  4. 自定义Office中格式刷的快捷键
  5. out of office ,out of the office,OOO的区别和联系
  6. 医药CRM解决方案,助力医药企业数字化转型
  7. ppt太大了微信发送不了怎么办?
  8. 近红外荧光染料IRDye 800CW 2-DG/BoneTag/EGF/RGD Optical Probe光学探头
  9. t.cn短链接生成 - 新浪短网址生成器压缩网址详细教程
  10. UNP读书笔记第一章