开发环境

opencv版本:4.5.1
VS版本:VS2017
qt版本:qt5.12.3
Sobel求梯度
目的:为了获取图像的边缘.
原理:梯度简单来说就是求导.
求导公式:

sobel算子:核(以3*3为例)

假设:

根据求导公式
①、X方向的梯度:
dx = ((-1)1+13)+((-2)4+26)+((-1)7+19) = 8
②、y方向的梯度:
dy = ((-1)1+17)+((-2)2+28)+((-1)3+19) = 24
③、XY方向的梯度:

伪代码:
X方向的梯度(仅支持核33)
输入:原图像,目标图像,核的大小
①、判断原图像是否为空,空则返回
②、判断核的大小是否为奇数,空则返回
③、将目标图像的大小和深度设置和原图像一致
④、判断核的大小是否为3
3
⑤、根据求导公式,算出核大小的x方向的梯度dx的值
⑥、取绝对值,如果结果超过255,就让其等于255(截断),再写入目标图像
y方向的梯度(仅支持核33)
输入:原图像,目标图像,核的大小
①、判断原图像是否为空,空则返回
②、判断核的大小是否为奇数,空则返回
③、将目标图像的大小和深度设置和原图像一致
④、判断核的大小是否为3
3
⑤、根据求导公式,算出核大小的y方向的梯度dy的值
⑥、取绝对值,如果结果超过255,就让其等于255(截断),再写入目标图像

结果图像:
原图:

x方向结果图:

y方向结果图:

XY方向结果图:

附核心部分源代码:
注:只处理3*3核

// x方向的梯度
void imageJ::GradX(cv::Mat &src, cv::Mat &dst, cv::Size wsize) {// 判断原图像是否为空if (src.empty()) {return;}// 判断核的大小是否为奇数if (wsize.height % 2 == 0 || wsize.width % 2 == 0) {return;}dst = Mat::zeros(src.size(), CV_8UC1);int dx = 0;if (wsize.height == 3 && wsize.width == 3) {for (int i = 1; i < src.rows - 1; i++) {for (int j = 1; j < src.cols - 1; j++) {dx = -(int)src.data[(i - 1)*src.cols + j - 1] + (int)src.data[(i + 1)*src.cols + j - 1]- 2 * (int)src.data[(i - 1)*src.cols + j] + 2 * (int)src.data[(i + 1)*src.cols + j]- (int)src.data[(i - 1)*src.cols + j + 1] + (int)src.data[(i + 1)*src.cols + j + 1];dx = abs(dx);if (dx > 255) {dx = 255;}dst.data[i*dst.cols + j] = dx;}}}else {return;}}
// y方向的梯度
void imageJ::GradY(cv::Mat &src, cv::Mat &dst, cv::Size wsize) {// 判断原图像是否为空if (src.empty()) {return;}// 判断核的大小是否为奇数if (wsize.height % 2 == 0 || wsize.width % 2 == 0) {return;}dst = Mat::zeros(src.size(), CV_8UC1);int dy = 0;if (wsize.height == 3 && wsize.width == 3) {for (int i = 1; i < src.rows - 1; i++) {for (int j = 1; j < src.cols; j++) {dy = -(int)src.data[(i - 1)*src.cols + j - 1] - 2 * (int)src.data[i*src.cols + j - 1]- (int)src.data[(i + 1)*src.cols + j - 1] + (int)src.data[(i - 1)*src.cols + j + 1]+ 2 * (int)src.data[i*src.cols + j + 1] + (int)src.data[(i + 1)*src.cols + j + 1];dy = abs(dy);if (dy > 255) {dy = 255;}dst.data[i*dst.cols + j] = dy;}}}else {return;}}

opencv,sobel求梯度,C++实现相关推荐

  1. C++自定义sobel求梯度

    Mat Sobel_gradient(Mat img, int direction) {Mat oriImage = img;Mat newImage_x = Mat(img.size(), CV_8 ...

  2. 利用Sobel算子,求梯度图像

    学习了Sobel算子,总结一下 上图中的模板为Sobel算子,之所以其中的系数是这样的,是因为和求他们偏导邻域的近似形式有关,具体请看书. 自己编写的利用Sobel算子,求梯度图像的matlab程序 ...

  3. OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)

    ::返回OpenCV算子速查表 OpenCV Sobel和Scharr 1. 函数定义 1.1 声明 1.2 重要参数解析 2. 例程 2.1 处理效果 原图 在x,y方向分别求导 如果两个方向一起求 ...

  4. Python+OpenCV:图像梯度

    Python+OpenCV:图像梯度(Image Gradients) 理论 OpenCV提供了三种类型的梯度滤波器或高通滤波器,Sobel, Scharr和Laplacian. 1. Sobel和S ...

  5. OpenCV之图像梯度

    1. Sobel算子 OpenCV系列-本文底页有多个常用方法链接 1.1 Sobel介绍 cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和 ...

  6. PyTorch入门学习(二):Autogard之自动求梯度

    autograd包是PyTorch中神经网络的核心部分,简单学习一下. autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次 ...

  7. ML之ME/LF:机器学习中常见模型评估指标/损失函数(LiR损失、L1损失、L2损失、Logistic损失)求梯度/求导、案例应用之详细攻略

    ML之ME/LF:机器学习中常见模型评估指标/损失函数(LiR损失.L1损失.L2损失.Logistic损失)求梯度/求导.案例应用之详细攻略 目录 常见损失函数求梯度案例 1.线性回归求梯度 2.L ...

  8. OpenCV Sobel Derivatives衍生物

    OpenCV Sobel Derivatives衍生物 Sobel Derivatives衍生物 目标 理论 索贝尔算子 代码 解释 声明变量 加载源图像 减少噪音 灰阶 索贝尔算子 将输出转换为CV ...

  9. 《动手学深度学习 PyTorch版》学习笔记(二):自动求梯度

    一.自动求梯度 1.requires_grad_(), detach(), torch.no_grad()的区别 参考博客:https://www.jianshu.com/p/ff74ccae25f3 ...

最新文章

  1. IOS 从系统图库中获取 图片 并设置为头像
  2. 如何选择合适的NoSQL数据库
  3. 计算机职业短命,最短命10种活法你占几条?9成人长期对电脑
  4. 关于CATALINA_BASE
  5. C#弹窗提示并自动关闭方法
  6. 三菱fx2n64mr说明书_FX2N-64MR-001原理及应用三菱FX2N-64MR-001使用说明书 - 三菱
  7. 在java中蓝色_Java基础
  8. uiautomator使用中文参数
  9. 计算机网络基础(二)
  10. poj 2392 Space Elevator 二进制拆包多重背包
  11. 职称英语计算机考试取消,2020年职称英语考试取消了吗
  12. Qt 编程 keySight 34401A 万用表(串口232编程)
  13. 子查询及其分类(标量子查询+列子查询+行子查询+表子查询)
  14. 引入函数库c语言,C语言标准函数库分析
  15. 常见的传输介质的种类和性能,你知道嘛?
  16. 盘点大厂的那些开源项目 - 滴滴出行
  17. 大学计算机相关基本知识,大学计算机基础知识试题
  18. R语言 先验概率分布与后验概率分布的计算
  19. 射频功放学习之微带线拐角射频性能分析
  20. 别让邮件营销成为鸡肋---53KF

热门文章

  1. 蚁剑加密 WebShell 过杀软
  2. 面试题31:JS中判断是数组的四种方法
  3. 【Vue】 组件封装
  4. 数据质量分析之校验规则模板
  5. web前端练手小项目——仿照小米商城
  6. 完了,又火一个软件测试实战项目
  7. WMSYS.WM_CONCAT标识符无效问题
  8. 很适合装逼的代码(Lambda表达式)
  9. 编程题006--判断是不是完全二叉树--niuke
  10. 如何写互联网产品分析报告,从哪些方面入手?