首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

opencv学习笔记15: 梯度运算之sobel算子及其函数使用

  • 23-09-22 21:01
  • 3271
  • 13973
blog.csdn.net

python+opencv

sobel算子理论

从不同方向计算梯度
如图从x轴计算p5的梯度。左边是卷积核系数
如果右边这一列和左边这一列相差很大,则计算出来的P5x很大,可以认为在边界上。否则不在边界上。用于求出图像边界

也可以从y轴计算梯度
如果上下相差很大,则计算出来的值很大,则认为是边界,否则不是。

整个图像梯度

sobel函数使用

dst=cv2.Sobel(src,ddepth,dx,dy,[kszie])
dst:处理结果
src:原始图像
ddpepth:处理图像的深度.-1表示与原始图像一样
dx:x轴方向,计算x轴方向,dx=1,dy=0
dy:y轴方向,计算y轴,dx=0,dy=1
[ksize]:核大小,默认3

不使用绝对值时,负值会被截断为0

实际操作中,计算梯度值可能会出现负值而被截断。通常处理的图像类型为np.unit8,处理后的结果也是该类型,所有负数截断为0,发生信息丢失。
所以,在计算时,使用更高的数据类型cv2.CV_64F,取绝对值后再转换成np.unit8(cv2.CV_8U)。所以深度ddepth不写-1,改cv2.CV_64F

cv2.convertScaleAbs(imgsrc)
取绝对值,并将梯度图像转换成256色位图,转换为unit8类型

计算方法
第一种:同时计算xy梯度,第一种有缺陷。
第二种:分别计算.然和相加
使用:处理结果dst = cv2.addWeighted(图像1src1,系数1,图像2src2,系数2,修正系数gamma)

sobel函数代码

深度ddepth=-1时

import cv2
import numpy as np
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,-1,1,0,ksize=3)
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以发现x轴的左边边界部分没有取到

深度ddepth=cv2.CV_64F时,不添加cv2.convertScaleAbs(imgsrc)

import cv2
import numpy as np
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以发现x轴的左边边界部分没有取到
这是因为绝对值未取
需要添加cv2.convertScaleAbs(imgsrc)
里面有个abs绝对值

深度ddepth=cv2.CV_64F时。添加cv2.convertScaleAbs(imgsrc),

import cv2
import numpy as np
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   # 转回uint8  
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

完美取到边界

x和y梯度系数相加

import cv2
import numpy as np
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   # 转回uint8
sobely = cv2.convertScaleAbs(sobely)
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.imshow("y",sobely)
cv2.imshow("xy",sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

同时计算x,y梯度。即dx=1,dy=1

import cv2
import numpy as np
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelxy11=cv2.Sobel(o,cv2.CV_64F,1,1,ksize=3)
cv2.imshow("original",o)
cv2.imshow("xy11",sobelxy11)
cv2.waitKey()
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

效果不行。舍弃这一方法。

总目录链接:
python3+opencv学习笔记汇总目录(适合基础入门学习)

进阶版梯度讲解:
opencv进阶学习笔记10:图像金字塔和图像梯度

电气专业的计算机小白,写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢。

文章知识点与官方知识档案匹配,可进一步学习相关知识
OpenCV技能树首页概览20473 人正在系统学习中
注:本文转载自blog.csdn.net的总裁余(余登武)的文章"https://blog.csdn.net/kobeyu652453/article/details/107149277"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top