我们都知道梯度很好求,只需要将[-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. Sleep-Join方法理解

    package cn.mayday.test; public class JoinTest { public static void main(String[] args) { try { int c ...

  2. IO流大文件拷贝

                            String resourcesPath="f:/a.grd";          String targetPath=" ...

  3. 跟hzwer学分块!?

    orz hzwer.分块啥的真是太强了- (块状链表也真是太强了-) Upd:Upd:Upd: 好像链接时不时会炸?这个时候就体现了转载的作用 如果上面链接用不了就戳这里

  4. 使用Joda-Time优雅的处理日期时间(转)

    简介 在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的 ...

  5. vue_03 练习

    1.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/001.png', title: 'tv1'}, {img: 'img/tv/002.p ...

  6. PHP mysqli_get_client_stats() 函数

    定义和用法 mysqli_get_client_stats() 函数返回有关客户端每个进程的统计. 语法 mysqli_get_client_stats(); 返回有关客户端每个进程的统计: < ...

  7. ec20 queclocator V1. 0 test

    AT+QICSGP=1,1,"UNIWAP","","",1 AT+QIACT=1 AT+QLOCCFG="contextid&q ...

  8. iosselect插件

    好用的时间选择器/地址选择器插件 iosselect.js

  9. 第四届西安邮电大学acm-icpc校赛 猜球球

    题目描述 六一到了,为了庆祝这个节日,好多商家都推出了很多好玩的小游戏.Tongtong看到了一个猜球球的游戏,有n种除了颜色之外完全相同的球,商家从中拿出来一个球球放到了箱子里,已知第i种颜色的球出 ...

  10. 早停!? earlystopping for keras

    为了获得性能良好的神经网络,网络定型过程中需要进行许多关于所用设置(超参数)的决策.超参数之一是定型周期(epoch)的数量:亦即应当完整遍历数据集多少次(一次为一个epoch)?如果epoch数量太 ...