我们都知道梯度很好求,只需要将[-1,1] 与图像分别在x 方向和y方向卷积,即可求得两个方向上的梯度。不过在求梯度方向时,还是有些麻烦,因为梯度方向会指向360°的任何一个方向,所以直接用atan(dy/dx)函数,通常会得到正负PI/2范围内的值,因此,在本文中将根据dy、dx的正负,求取任一象限内的梯度方向。x、y以及四个象限如下图所示:

在本文中编制了两个函数一个是获取梯度方向函数

Mat getGradientDirect(Mat&img_dy,Mat&img_dx)

一个是将梯度方向等分为8个方向:0、PI/4、PI/2、PI、5PI/4、3PI/2、7PI/4.。函数名为:
void octantDirect(Mat&theta)

下面是两个函数的代码:

Mat getGradientDirect(Mat&img_dy,Mat&img_dx)
{
int rows=img_dx.rows,cols=img_dy.cols;
Mat theta(rows,cols,img_dx.type(),Scalar::all(0));
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
Vec3f dx=img_dx.at<Vec3f>(i,j);
Vec3f dy=img_dy.at<Vec3f>(i,j);
for(int k=0;k<theta.channels();k++)
{
if(dx[k]>0&&dy[k]==0)//X正向
theta.at<Vec3f>(i,j)[k]=0;
if(dx[k]>0&&dy[k]>0)//第1象限
theta.at<Vec3f>(i,j)[k]=atan(dy[k]/dx[k]);
if(dx[k]==0&&dy[k]>0)//Y正向
theta.at<Vec3f>(i,j)[k]=PI/2;
if(dx[k]<0&&dy[k]>0)//第2象限
theta.at<Vec3f>(i,j)[k]=atan(dy[k]/dx[k])+PI;
if(dx[k]<0&&dy[k]==0)//X负向
theta.at<Vec3f>(i,j)[k]=PI;
if(dx[k]<0&&dy[k]<0)//第3象限
theta.at<Vec3f>(i,j)[k]=atan(dy[k]/dx[k])+PI;
if(dx[k]==0&&dy[k]<0)//Y负向
theta.at<Vec3f>(i,j)[k]=PI*1.5;
if(dx[k]>0&&dy[k]<0)//第4象限
theta.at<Vec3f>(i,j)[k]=atan(dy[k]/dx[k])+2*PI;
if(dx[k]==0&&dy[k]==0)// dy/dx=0/0
theta.at<Vec3f>(i,j)[k]=0;
}
}
}
return theta;
}

  八分仪代码:

void octantDirect(Mat&theta)
{
int rows=theta.rows,cols=theta.cols;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
auto p=theta.at<Vec3f>(i,j);
// auto pr=theta.data+i*theta.step[0]+j*theta.step[1];
for(int k=0;k<theta.channels();k++)
{
if((0.125*PI>p[k]&&p[k]>=0) ||
( PI*2>p[k]&&p[k]>=PI*1.875))
theta.at<Vec3f>(i,j)[k]=0;
if(0.375*PI>p[k]&&p[k]>=0.125*PI)
theta.at<Vec3f>(i,j)[k]=1;
if(0.625*PI>p[k]&&p[k]>=0.375*PI)
theta.at<Vec3f>(i,j)[k]=2;
if(0.875*PI>p[k]&&p[k]>=0.625*PI)
theta.at<Vec3f>(i,j)[k]=3;
if(1.125*PI>p[k]&&p[k]>=0.875*PI)
theta.at<Vec3f>(i,j)[k]=4;
if(1.375*PI>p[k]&&p[k]>=1.125*PI)
theta.at<Vec3f>(i,j)[k]=5;
if(1.625*PI>p[k]&&p[k]>=1.375*PI)
theta.at<Vec3f>(i,j)[k]=6;
if(1.875*PI>p[k]&&p[k]>=1.625*PI)
theta.at<Vec3f>(i,j)[k]=7;
} }
}
}

  

基于Opencv的梯度及其方向的更多相关文章

  1. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

  2. Canny边缘检测算法(基于OpenCV的Java实现)

    目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...

  3. 为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍

            基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题.对于c++语系的程序员来说,一般来说有QT/MFC两种考虑.QT的确功能强大,特别是QML编写andr ...

  4. 图像矫正-基于opencv实现

    一.引言 上篇文章中四种方法对图像进行倾角矫正都非常有效.Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:我们可以不对整幅图像进行操作,可以在图像中选取一块 ...

  5. 基于OpenCV的火焰检测(一)——图像预处理

    博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...

  6. 【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍

            基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题.对于c++语系的程序员来说,一般来说有QT/MFC两种考虑.QT的确功能强大,特别是QML编写andr ...

  7. 基于OpenCV的双目视觉匹配测距系统

    刚读研究生的时候,自己导师研究的方向是双目视觉,于是让自己研究OpenCV,折腾了几个月,算法上没啥突破,不过工程上还是折腾出了一个能用的小玩意,基于OpenCV实现了相机的标定.双目视觉图片的矫正. ...

  8. 基于 opencv 的图像处理入门教程

    前言 虽然计算机视觉领域目前基本是以深度学习算法为主,但实际上很多时候对图片的很多处理方法,并不需要采用深度学习的网络模型,采用目前成熟的图像处理库即可实现,比如 OpenCV 和 PIL ,对图片进 ...

  9. [转载]卡尔曼滤波器及其基于opencv的实现

    卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...

随机推荐

  1. 利用Struts上传文件

    在利用struts2完成上传文件到服务器时,遇到获取不到文件名 原因是在Action中的属性名没有和jsp中的属性名匹配 <%@ page language="java" i ...

  2. MyBatis-07-分页

    7.分页 思考:为什么要分页? 减少数据的处理量 7.1.使用Limit分页 select * from user limit startIndex,pageSize 使用Mybatis实现分页,核心 ...

  3. ak-1

    最近研究ak,网上也有很多这方面的资料,就不重复叙述了,本次记录就是自己在做适应时的一些记录. 本次环境 中标麒麟  金蝶apusic 人大金仓 先说说东西从哪下载怎么来的 基本都是通过官网打电话申请 ...

  4. 洛谷P4983 忘情 (WQS二分+斜率优化)

    题目链接 忘情水二分模板题,最优解对划分段数的导数满足单调性(原函数凸性)即可使用此方法. 详细题解洛谷里面就有,不啰嗦了. 二分的临界点让人有点头大... #include<bits/stdc ...

  5. Gym - 102028H Can You Solve the Harder Problem? (后缀数组+RMQ+单调栈)

    题意:求一个序列中本质不同的连续子序列的最大值之和. 由于要求“本质不同”,所以后缀数组就派上用场了,可以从小到大枚举每个后缀,对于每个sa[i],从sa[i]+ht[i]开始枚举(ht[0]=0), ...

  6. 【高维前缀和】8.15B. 组合数

    题目分析 没有接触过高维前缀和的话会有一点抽象

  7. retrying failed action with response code: 403 错误解决

    [2019-06-10T06:52:51,610][INFO ][logstash.outputs.elasticsearch] retrying failed action with respons ...

  8. HDU3501 Calculation 2 [欧拉函数]

    题目传送门 Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. Spring Boot中@OneToMany与@ManyToOne几个需要注意的问题

    @OneToMany如果不加@JoinColumn,系统会自动在主从表中增加一个中间表. 主表: @Entity(name = "Post") public class Post  ...

  10. VUE项目引入jquery

    既然写项目,那么少不了用jq,那我们就引入进来吧 1.因为已经安装了vue脚手架,所以需要在webpack中全局引入jquery 打开package.json文件,在里面加入这行代码,jquery后面 ...