目录
1 sobel理论基础
1.1 基础理论
目的: 利用卷积核,计算不同方向上的梯度.
- x方向有无边界: 右边- 左边
计算点P5 x方向上的梯度. 根据距离,对卷积核设置不同的系数
- y方向有无边界:下边 - 上边
与x方向类似, 计算点P5 y方向上的梯度.
- 计算近似梯度
进一步简化
对图中点P5,进行梯度计算:
2 sobel算子及其函数使用
2.1 基础理论
- 计算梯度
dst=cv2.Sobel(src, ddepth, dx, dy, [ksize])
其中,参数:
・src – 输入图像;
・ddepth– 图像深度;
→ -1,表示和原图像深度一致,但是计算梯度值时会出现负数,自动截断为0,导致信息丢失
→ cv2.CV_64F,改变输出的数据类型,设置的更高,使之允许存在负数. 在后续操作中绝对值后,再转换为np.uint8类型
・dx – x方向;
→ [dx=1,dy=0]
・dy – y方向;
→ [dx=0,dy=1]
・ [ksize] – 核大小;
→ 须为奇数(如1,3,5),默认为3
→ -1时,自动转换为scharr算子
- 修正梯度结果(负数转正)
dst = cv2.convertScaleAbs(src[,alpha[,beta]])
dst = cv2.convertScaleAbs(src) 简化版
将原始图像转换为256色位图,表示对负数取绝对值 dst = 调整(原始图像*alpha系数 + beta修正值)
- 计算sobel
有2种方式.
・方式1不太严谨,往往会得到错误的结果
・所以一般采用方式2: 分别计算出x,y方向的梯度后相加
方式2 借用cv2.addWeighted
函数计算 x,y 两幅图像的权重和
dst= cv2.addWeighted(src1,alpha,src2,beta,gamma)
其中,参数:
・dst– 计算结果;
・src1 – 源图像1;
・alpha– 源图像1系数;
・src2 – 源图像2;
・beta– 源图像2系数;
・gamma– 修正值;
2.2 代码示例
import cv2
import numpy as np
o = cv2.imread('image\\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