Python +OpenCV CH10:图像梯度

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值