图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)。。。

这些算子的原理可参考:https://blog.csdn.net/poem_qianmo/article/details/25560901

下面是我的一些理解:


sabel算子:

sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。

函数

Python: cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst  (参数就不一一说了,常用的就那几个,其他默认即可)

Parameters:

  • src – Source image.
  • dst – Destination image of the same size and the same number of channels as src .
  • ddepth – Destination image depth.
  • xorder – Order of the derivative x.
  • yorder – Order of the derivative y.
  • ksize – Size of the extended Sobel kernel. It must be 1, 3, 5, or 7.
  • scale – Optional scale factor for the computed derivative values. By default, no scaling is applied. See getDerivKernels() for details.
  • delta – Optional delta value that is added to the results prior to storing them in dst .
  • borderType – Pixel extrapolation method. See borderInterpolate() for details.

原理

算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去和原始图片作卷积,分别得到横向G(x)和纵向G(y)的梯度值,如果梯度值大于某一个阈值,则认为该点为边缘点

Gx方向的相关模板:

Gy方向的相关模板:

具体计算如下:

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

通常,为了提高效率使用不开平方的近似值:

#sobels算子
img = cv.imread("E:/pictures/lena.jpg",cv.IMREAD_UNCHANGED)
sobelx= cv.Sobel(img,cv.CV_64F,1,0)         #cv.CV_64F将像素值转换为double型,不然计算后为负值的像素会被截断为0
sobelx = cv.convertScaleAbs(sobelx)       #转换为uint8类型(x方向)
sobely = cv.Sobel(img,cv.CV_64F,0,1)
sobely = cv.convertScaleAbs(sobely)
sobelxy11 = cv.Sobel(img,cv.CV_64F,1,1)       #直接x,y方向一起计算(效果不好,应分开计算,再求权重和)
sobelxy11 = cv.convertScaleAbs(sobelxy11)
sobelxy = cv.addWeighted(sobelx,0.5,sobely,0.5,0)  #图像权重和
cv.imshow("orginal",img)               #dst = cv.addWidget(src1,alpha,src2,beta,gamma)
cv.imshow("sobelx",sobelx)            #src1 图一  alpha->图一的权重  src2->图二 beta->图二的权重 gamma->修正值
cv.imshow("sobely",sobely)          #dst = src1*alpha+src2*beta+gamma
cv.imshow("sobelxy",sobelxy)
cv.imshow("sobelxy11",sobelxy11)
cv.waitKey()
cv.destroyAllWindows()

用sobel函数同时对想x,y方向检测的效果并不好,一般不用。


scharr算子:

函数:

Python: cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]) → dst

Parameters:
  • src – Source image.
  • dst – Destination image of the same size and the same number of channels as src .
  • ddepth – Destination image depth.
  • xorder – Order of the derivative x.
  • yorder – Order of the derivative y.
  • scale – Optional scale factor for the computed derivative values. By default, no scaling is applied. See getDerivKernels() for details.
  • delta – Optional delta value that is added to the results prior to storing them in dst .
  • borderType – Pixel extrapolation method. See borderInterpolate() for details.

scharr算子是对sabel算子的增强,可以看到上图中很多细小的边缘都没检测到,那么scharr算子就是解决这个问题的,它比sabel算子更精确,速度和复杂程度却一样,只是因为用的核不一样

是scharr 的卷积核,他的原理和sabel算子一样。

#scharr算子  scharr算子是对sabel算子的增强  scharr算子等价于ksize=-1的sabel算子
img = cv.imread("E:/pictures/lena.jpg",cv.IMREAD_GRAYSCALE)
scharrx= cv.Scharr(img,cv.CV_64F,1,0)             #scharrx算子要满足dx>=0&&dy>=0&&dx+dy=1
scharrx = cv.convertScaleAbs(scharrx)
scharry = cv.Scharr(img,cv.CV_64F,0,1)
scharry = cv.convertScaleAbs(scharry)
scharrxy = cv.addWeighted(scharrx,0.5,scharry,0.5,0)
#sabel算子和 scharr算子的比较
sobelx= cv.Sobel(img,cv.CV_64F,1,0)
sobelx = cv.convertScaleAbs(sobelx)
sobely = cv.Sobel(img,cv.CV_64F,0,1)
sobely = cv.convertScaleAbs(sobely)
sobelxy = cv.addWeighted(sobelx,0.5,sobely,0.5,0)
cv.imshow("orginal",img)
cv.imshow("sobelxy",sobelxy)
cv.imshow("scharrxy",scharrxy)
cv.waitKey()
cv.destroyAllWindows()

 


laplacian算子:

Laplace算子和Sobel算子一样,属于空间锐化滤波操作,只不过是用的二阶微分,看官网的一些解释:

The function calculates the Laplacian of the source image by adding up the second x and y derivatives calculated using the Sobel operator:

This is done when ksize > 1 . When ksize == 1 , the Laplacian is computed by filtering the image with the following aperture:

cv.Laplace(src, dst, ksize=3) → None

Parameters:

  • src – Source image.
  • dst – Destination image of the same size and the same number of channels as src .
  • ddepth – Desired depth of the destination image.
  • ksize – Aperture size used to compute the second-derivative filters. See getDerivKernels() for details. The size must be positive and odd.
  • scale – Optional scale factor for the computed Laplacian values. By default, no scaling is applied. See getDerivKernels() for details.
  • delta – Optional delta value that is added to the results prior to storing them in dst .
  • borderType – Pixel extrapolation method. See borderInterpolate() for details.
#拉普拉斯算子
img = cv.imread("E:/pictures/erode1.jpg",cv.IMREAD_GRAYSCALE)
r = cv.Laplacian(img,cv.CV_64F)
r = cv.convertScaleAbs(r)     #关键代码就这两行,拉普拉斯算子不用再求x,y的权重和,因为这个函数都计算好了
cv.imshow("orginal",img)
cv.imshow("laplacian",r)
cv.waitKey()
cv.destroyAllWindows()

  

 


Canny边缘检测:

Python: cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) → edges

threshold1和threshold2是两个阈值,越小检测效果越好

import cv2 as cv
import numpy as npimg = cv.imread("E:/pictures/lena.jpg")
result1 = cv.Canny(img,50,100)
result2 = cv.Canny(img,100,200)
cv.imshow("orginal",img)
cv.imshow("result1",result1)
cv.imshow("result2",result2)
cv.waitKey()
cv.destroyAllWindows()

 

转载于:https://www.cnblogs.com/ling2000/p/10588294.html

opencv学习笔记(六)---图像梯度相关推荐

  1. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  2. java 图像梯度检测_opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 下面是我的一些理解: sabel算子: sobel算子主要用于获得数字图像的一 ...

  3. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  4. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  5. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  6. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  7. opencv学习笔记17:梯度运算之laplacian算子及其应用

    laplacian算子理论 前文介绍了sobel算子及其函数使用 和scharr算子及其函数使用 使用方法 不同算子比较 sobel,和scharr算子:右边121列-左边121列.右边-3,10,3 ...

  8. opencv学习笔记16:梯度运算之scharr算子及其函数使用

    前文介绍了sobel算子 opencv学习笔记14:sobel算子及其函数使用 scharr算子理论 系数和sobel不一样,其他一样. scharr函数使用 dst=cv2.Scharr(src,d ...

  9. Opencv学习笔记七(梯度算子、锐化)

    Sobel算子 卷积的作用除了实现图像模糊或者去噪,还可以寻找一张图像上所有梯度信息,这些梯度信息是图像的最原始特征数据,进一步处理之后就可以生成一些比较高级.抽象的特征用来表示一张图像实现基于图像特 ...

最新文章

  1. Python面试题集合
  2. ssh服务、密钥登陆配置
  3. 网络基础: 浅析应用层一
  4. 使用 Syslog 连接 Sentinel
  5. c语言空格键么 有什么意义,C语言里这个空格键跟'\0'到底啥区别啊?
  6. c++指定在某一线程运行_深入理解Java虚拟机-运行时数据区
  7. oracle不停机迁移数据库,Oracle 12.2 使用datagurd技术极短停机时间内快速迁移数据库方案步骤...
  8. 《Android测试的学习笔记》——Introduction
  9. 机器学习决策树_机器学习-决策树 Decision Tree
  10. 作为JavaScript的“超集”,感受一下TypeScript 的那些黑魔法
  11. 防止浏览器嗅探音视频--blob对象在audio和video标签中的使用
  12. 三维扫描仪[3]——标定·理论
  13. LOVE2D中实现一个简单的摇杆
  14. win7 GHOST删除桌面上IE图标
  15. Windows Defender卸载
  16. 领扣LintCode问题答案-5. 第k大元素
  17. 1.图灵学院-----阿里/京东/滴滴/美团整理----高频JAVA并发篇
  18. 数仓实时数据同步 debezium
  19. java中无限循环的方法_Java中的无限循环
  20. 深圳的“专精特新”实力如何?

热门文章

  1. Servlet 的常见错误总结
  2. Java的知识点25——程序、进程与线程 || 线程的创建和启动
  3. 计算机组成原理——概述
  4. Elasticsearch的或且非及其组合
  5. IMXRT10xx MDK 编译器AC5 升级AC6
  6. CTFshow 反序列化 web258
  7. How far away ? HDU - 2586
  8. sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历
  9. html文件上传协议,HTTP 上传文件的协议格式
  10. MySQL下载以及安装【windows】