OpenCV计算机视觉实战(Python)_05-图像梯度处理
图像梯度-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-图像梯度处理相关推荐
- OpenCV计算机视觉实战(Python版)_002图像基本操作
OpenCV计算机视觉实战(Python版) https://www.bilibili.com/video/BV1ct411F7Te?p=2 数据读取-图像 cv2.IMREAD_COLOR:彩色图像 ...
- OpenCV计算机视觉实战(Python版)资源
疲劳检测 pan.baidu.com/s/1Ng_-utB8BSrXlgVelc8ovw #导入工具包 from scipy.spatial import distance as dist from ...
- OpenCV计算机视觉实战(Python版)_005图像的梯度处理
图像梯度-Sobel算子 img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.wa ...
- OpenCV计算机视觉实战(Python版)_004图像形态学处理
形态学处理 腐蚀操作 img = cv2.imread('dige.png')cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() ...
- OpenCV计算机视觉实战(Python版)_006边缘检测
Canny边缘检测 使用高斯滤波器,以平滑图像,滤除噪声. 计算图像中每个像素点的梯度强度和方向. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应. ...
- OpenCV计算机视觉实战(Python版)_003阈值与平滑处理
灰度图 import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %m ...
- OpenCV计算机视觉实战(Python)_09-项目实战:信用卡数字识别( Jupyter notebook实现)
1.介绍 从一个银行卡中识别其中的银行卡号: 2. 流程 读图 , 灰度图 , 二值化 使用模板匹配方式对模板,以及输入图像进行轮廓检测(检测外轮廓). 得到当前轮廓的外接矩形. 将模板中的外接矩形切 ...
- OpenCV计算机视觉实战 | 第5章 图像梯度算子
本文为课程<OpenCV计算机视觉实战>的课程笔记. 本章节讲述了图像梯度的计算方法.图像的梯度表征每个像素点和周围像素点差异程度. 上:梯度值公式:下:梯度方向公式 1 Sobel算子 ...
- OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别
文章目录 简介 总结 1. 介绍 2. 流程 3. 程序 4. 知识点总结 简介 本节为<OpenCV计算机视觉实战(Python)>版第10讲,项目实战:文档扫描OCR识别,的总结. 总 ...
最新文章
- [转发]SPRING MVC3.2案例讲解--SPRING MVC3的@ResponseBody和ResponseEntity
- 关于GIT的SSH加密问题
- 四、MySQL分页查询 + 子查询复习 学习笔记 (复习连接查询相关内容 详解)
- Diy页面服务端渲染解决方案
- 中国农业大学计算机学院博士,[北京]中国农业大学工学院农业机器人团队
- 乱七八糟的,mark的东西...
- 好程序员分享js实现简单的板球游
- Android的Bundle传递数据的使用
- 中台,都被你们说糊涂了
- Spring异步切面源码解析
- 随机生成爆破密码字典.txt
- 使用wunderlist进行TODO管理
- php 执行bat文件,bat执行PHP文件
- 信息系统规划方法-业务流程再造(BPR)
- 关于安装SQLServer2012时遇到1402错误,未能打开注册表项的解决方法
- mysql系统,MySQL系统架构
- 三星证实遭黑客入侵:Galaxy手机源代码泄露
- 不能上升到金钱的爱都不是真爱!
- 【_ 記 】各类邮箱POP3和SMTP服务器地址和端口
- 2021-11-15----韩顺平Java入门第九天