图像梯度-Sobel算子

其计算梯度的过程为:

  • sobel和scharr对应的参数信息:
  • src – 输入图像。dst – 输出图像,与输入图像同样大小,拥有同样个数的通道。
  • ddepth –输出图片深度;下面是输入图像支持深度和输出图像支持深度的关系:
  • src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
  • src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
  • src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
  • src.depth() = CV_64F, ddepth = -1/CV_64F
  • 当 ddepth为-1时, 输出图像将和输入图像有相同的深度。输入8位图像则会截取顶端的导数。
  • xorder – x方向导数运算参数。yorder – y方向导数运算参数。
  • ksize – Sobel内核的大小,可以是:1,3,5,7。 注意:只可以是小于7 的奇数
  • scale – 可选的缩放导数的比例常数。delta – 可选的增量常数被叠加到导数中。borderType – 用于判断图像边界的模式。
import cv2
img = cv2.imread("D:/WeChat.picture/pie.jpg")
cv2.waitKey(0)
cv2.destroyAllWindows()

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:图像的深度 通常情况指定为 -1
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小
def cv_show(img ,name):cv2.imshow(name , img)cv2.waitKey(0)cv2.destroyAllWindows()
img = cv2.imread("D:/WeChat.picture/pie.jpg")
sobelx = cv2.Sobel(img , cv2.CV_64F , 1, 0, ksize = 3)
cv_show(sobelx,"sobelx")
  • 1 注意,各种算子的计算,均为:右-左,下-上
  • 2 在相减的过程中,从白到黑的相减,是正数,但是从黑到白的相减是负数,由于像素值被限制在0-255范围内,所有的负数会被截断为0,所以要取绝对值: cv2.convertScaleAbs(sobelx),在取绝对值之前,要将负数形式保存,因此,第二个参数写作:cv2.CV_64F
  • 3 如果同时计算x/y轴的梯度,效果并不好,因此分别做x和y轴的梯度,然后得到加权的结果。
  • 4 cv2.addWeighted(sobelx, 0.5, sobely, 0.5,0)中,0.5表示权重;0表示偏置项,不写的话默认为0

白到黑是正数, 黑到白就是负数了,所有的负数会被截断成0,所有要取绝对值

sobelx = cv2.Sobel(img ,cv2.CV_64F , 1 ,0 ,  ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)  # ksize 指定 number ✖ number
cv_show(sobelx , "sobelx")
sobely = cv2.Sobel(img ,cv2.CV_64F , 0 ,1 ,  ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
cv_show( sobely ,"sobely" )

图像梯度-Scharr算子

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)
  • 1 Scharr算子相比于sobel算子,增大了相邻点的权重
  • 2 带来的结果是,它的梯度信息会更丰富,得到的图像中,细节会更多。

不建议直接计算 cv2.Sobel(img , cv2.CV_64F , 1, 1, ksize = 3)

import cv2
sobelxy = cv2.addWeighted(sobelx ,0.5, sobely , 0.5, 0) #将第五个参数设为 0 即可
cv_show( sobelxy , "sobelxy")
img = cv2.imread("D:/WeChat.picture/lena.jpg",0 )# 第二个参数 0 表示 Gray输出
img = cv2.medianBlur(img , 3)
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")
img = cv2.imread("D:/WeChat.picture/lena.jpg",0)
mg = cv2.medianBlur(img ,5)sobelxy_1 = cv2.Sobel(img , cv2.CV_64F , 1 , 1 , ksize = 3)
cv_show( sobelxy ,"sobelxy_1" )
# 少了绝对值
import cv2
import numpy as np
img = cv2.imread("D:/WeChat.picture/lena.jpg",0)
img = cv2.medianBlur(img , 5)sobelx = cv2.Sobel(img , cv2.CV_64F , 1 ,0 ,ksize = 3)
sobely = cv2.Sobel(img , cv2.CV_64F , 0 ,1 ,ksize = 3)
sobelxy = cv2.addWeighted( sobelx ,0.5 , sobely ,0.5 , 0)
sobelxy_1 = cv2.Sobel(img , cv2.CV_64F , 1 ,1 ,0)res = np.hstack((sobelxy , sobelxy_1))
cv_show(res ,"res")
# 加了绝对值
import cv2
import numpy as np
img = cv2.imread("D:/WeChat.picture/lena.jpg",0)
img = cv2.medianBlur(img , 5)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)
sobelxy_1 = cv2.Sobel(img , cv2.CV_64F , 1 ,1 ,0)
sobelxy_1 = cv2.convertScaleAbs(sobelxy_1)res = np.hstack((sobelxy , sobelxy_1))
cv_show(res ,"res")

aplacian算子

Laplacian算子的表达式为:

  • 1 Laplacian算子,不是计算单x或者单y,而是将当前像素点,与周围像素点相比较,如果该点是边界,那么输出值比较大
  • 2 Laplacian算子,对噪声点敏感(因为只考虑了上下左右四个像素点对中间像素点的影响,没有考虑左上左下右上右下点)
  • 3 一般该算子不单独使用

各种算子的比较

# 不同算子的差异
def cv_show(img ,name):cv2.imshow(img , name)cv2.waitKey(0)cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread("D:/WeChat.picture/lena.jpg",cv2.IMREAD_GRAYSCALE)
img = cv2.medianBlur(img ,5)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)scharrx = cv2.Scharr(img , cv2.CV_64F , 1 , 0 )
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img , cv2.CV_64F , 0 , 1 )
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted( scharrx , 0.5 , scharry , 0.5 , 0)laplacian = cv2.Laplacian(img , cv2.CV_64F )  #(img , cv2.CV_64F , ksize = 3) ❌
laplacian = cv2.convertScaleAbs(laplacian)res = np.hstack ((sobelxy , scharrxy , laplacian))
cv_show( "res", res)
cv2.waitKey(0)
cv2.des

OpenCV计算机视觉实战(Python)_05-图像梯度处理相关推荐

  1. OpenCV计算机视觉实战(Python版)_002图像基本操作

    OpenCV计算机视觉实战(Python版) https://www.bilibili.com/video/BV1ct411F7Te?p=2 数据读取-图像 cv2.IMREAD_COLOR:彩色图像 ...

  2. OpenCV计算机视觉实战(Python版)资源

    疲劳检测 pan.baidu.com/s/1Ng_-utB8BSrXlgVelc8ovw #导入工具包 from scipy.spatial import distance as dist from ...

  3. OpenCV计算机视觉实战(Python版)_005图像的梯度处理

    图像梯度-Sobel算子 img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.wa ...

  4. OpenCV计算机视觉实战(Python版)_004图像形态学处理

    形态学处理 腐蚀操作 img = cv2.imread('dige.png')cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() ...

  5. OpenCV计算机视觉实战(Python版)_006边缘检测

    Canny边缘检测 使用高斯滤波器,以平滑图像,滤除噪声. 计算图像中每个像素点的梯度强度和方向. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应. ...

  6. OpenCV计算机视觉实战(Python版)_003阈值与平滑处理

    灰度图 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %m ...

  7. OpenCV计算机视觉实战(Python)_09-项目实战:信用卡数字识别( Jupyter notebook实现)

    1.介绍 从一个银行卡中识别其中的银行卡号: 2. 流程 读图 , 灰度图 , 二值化 使用模板匹配方式对模板,以及输入图像进行轮廓检测(检测外轮廓). 得到当前轮廓的外接矩形. 将模板中的外接矩形切 ...

  8. OpenCV计算机视觉实战 | 第5章 图像梯度算子

    本文为课程<OpenCV计算机视觉实战>的课程笔记. 本章节讲述了图像梯度的计算方法.图像的梯度表征每个像素点和周围像素点差异程度. 上:梯度值公式:下:梯度方向公式 1 Sobel算子 ...

  9. OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别

    文章目录 简介 总结 1. 介绍 2. 流程 3. 程序 4. 知识点总结 简介 本节为<OpenCV计算机视觉实战(Python)>版第10讲,项目实战:文档扫描OCR识别,的总结. 总 ...

最新文章

  1. [转发]SPRING MVC3.2案例讲解--SPRING MVC3的@ResponseBody和ResponseEntity
  2. 关于GIT的SSH加密问题
  3. 四、MySQL分页查询 + 子查询复习 学习笔记 (复习连接查询相关内容 详解)
  4. Diy页面服务端渲染解决方案
  5. 中国农业大学计算机学院博士,[北京]中国农业大学工学院农业机器人团队
  6. 乱七八糟的,mark的东西...
  7. 好程序员分享js实现简单的板球游
  8. Android的Bundle传递数据的使用
  9. 中台,都被你们说糊涂了
  10. Spring异步切面源码解析
  11. 随机生成爆破密码字典.txt
  12. 使用wunderlist进行TODO管理
  13. php 执行bat文件,bat执行PHP文件
  14. 信息系统规划方法-业务流程再造(BPR)
  15. 关于安装SQLServer2012时遇到1402错误,未能打开注册表项的解决方法
  16. mysql系统,MySQL系统架构
  17. 三星证实遭黑客入侵:Galaxy手机源代码泄露
  18. 不能上升到金钱的爱都不是真爱!
  19. 【_ 記 】各类邮箱POP3和SMTP服务器地址和端口
  20. 2021-11-15----韩顺平Java入门第九天

热门文章

  1. Flutter之自定义路由切换动画
  2. 怎样运行sql2008服务器,怎么开启SQL数据库服务
  3. 香蕉派BPI-M5折腾记录(3)—— 编译BSP
  4. VASP6.1.0中VTST插件的编译
  5. Hdu 2027 getchar用法
  6. 华为fusionaccess云桌面AD域虚拟机故障替换
  7. 机器学习总结(十一):深度学习算法(CNN,SAE,等)及常见问题总结
  8. SCCP用户消息的互通SCCP用户消息的互通
  9. 在html中加下划线
  10. 安卓android日期选择器对话框 DatePickerDialog,实现日期选择,滚动式选择日期