欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-07 19:34:31
python+opencvsobel算子理论从不同方向计算梯度如图从x轴计算p5的梯度。左边是卷积核系数如果右边这一列和左边这一列相差很大,则计算出来的P5x很大,可以认为在边界上。否则不在边界上。用于求出图像边界也可以从y轴计算梯度如果上下相差很大,则计算出来的值很大,则认为是边界,否则不是。整个图像梯度sobel函数使用dst=cv2.Sobel(src,ddepth,dx,dy,[kszie])dst:处理结果src:原始图像ddpepth:处理图像的深度.-1表示与...

python+opencv

sobel算子理论

从不同方向计算梯度
如图从x轴计算p5的梯度。左边是卷积核系数
如果右边这一列和左边这一列相差很大,则计算出来的P5x很大,可以认为在边界上。否则不在边界上。用于求出图像边界
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
也可以从y轴计算梯度
如果上下相差很大,则计算出来的值很大,则认为是边界,否则不是
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
整个图像梯度
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用

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
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
不使用绝对值时,负值会被截断为0
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
实际操作中,计算梯度值可能会出现负值而被截断。通常处理的图像类型为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)
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用

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()

可以发现x轴的左边边界部分没有取到
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
深度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()

可以发现x轴的左边边界部分没有取到
这是因为绝对值未取
需要添加cv2.convertScaleAbs(imgsrc)
里面有个abs绝对值
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
深度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()

完美取到边界
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
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()

荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
同时计算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()

效果不行。舍弃这一方法。
荐
                                                        opencv学习笔记15: 梯度运算之sobel算子及其函数使用
总目录链接:
python3+opencv学习笔记汇总目录(适合基础入门学习)

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

本文地址:https://blog.csdn.net/kobeyu652453/article/details/107149277