基于Opencv的梯度及其方向
我们都知道梯度很好求,只需要将[-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的梯度及其方向的更多相关文章
- OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...
- Canny边缘检测算法(基于OpenCV的Java实现)
目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...
- 为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍
基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题.对于c++语系的程序员来说,一般来说有QT/MFC两种考虑.QT的确功能强大,特别是QML编写andr ...
- 图像矫正-基于opencv实现
一.引言 上篇文章中四种方法对图像进行倾角矫正都非常有效.Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:我们可以不对整幅图像进行操作,可以在图像中选取一块 ...
- 基于OpenCV的火焰检测(一)——图像预处理
博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...
- 【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍
基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题.对于c++语系的程序员来说,一般来说有QT/MFC两种考虑.QT的确功能强大,特别是QML编写andr ...
- 基于OpenCV的双目视觉匹配测距系统
刚读研究生的时候,自己导师研究的方向是双目视觉,于是让自己研究OpenCV,折腾了几个月,算法上没啥突破,不过工程上还是折腾出了一个能用的小玩意,基于OpenCV实现了相机的标定.双目视觉图片的矫正. ...
- 基于 opencv 的图像处理入门教程
前言 虽然计算机视觉领域目前基本是以深度学习算法为主,但实际上很多时候对图片的很多处理方法,并不需要采用深度学习的网络模型,采用目前成熟的图像处理库即可实现,比如 OpenCV 和 PIL ,对图片进 ...
- [转载]卡尔曼滤波器及其基于opencv的实现
卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...
随机推荐
- 本地安装mysql脚本
[root@tianyun ~]# vim mysql_install.sh #!/usr/bin/env bash #mysql install 2 #by tianyun #yum 配置yum源 ...
- p4434 [COCI2017-2018#2] Usmjeri
思路 并查集的好题 考虑到求满足条件限制的方案数,显然观察样例可知结果就是2^x,x是互不影响的边的集合数量 然后考虑如何求互不影响的边的集合数量 可以使用并查集,用i和i+n表示这个点的父亲连向它的 ...
- NPM酷库:jsdom,纯JS实现的DOM
NPM酷库,每天两分钟,了解一个流行NPM库. 昨天认识了一个在Node.js环境下操作HTML的库 cheerio,cheerio实现了jQuery接口,用起来十分方便.为什么不直接用jQuery呢 ...
- 题解 [51nod1274] 最长递增路径
题面 解析 这题一眼DP啊. 然而想了半天毫无思路. 后来看题解后发现可以按边权的大小顺序DP. 将边权从小到大排序,对于权值相同的边分为一组. 设\(f[i][0]\)表示经过当前权值的边后到达\( ...
- scrapy+selenium 爬取淘宝商城商品数据存入到mongo中
1.配置信息 # 设置mongo参数 MONGO_URI = 'localhost' MONGO_DB = 'taobao' # 设置搜索关键字 KEYWORDS=['小米手机','华为手机'] # ...
- map(callback)将一组元素转换成其他数组(不论是否是元素数组)
map(callback) 概述 将一组元素转换成其他数组(不论是否是元素数组) 你可以用这个函数来建立一个列表,不论是值.属性还是CSS样式,或者其他特别形式.这都可以用'$.map()'来方便的建 ...
- golang——reverse反转字符串
reverse反转,是个比较基础算法.要实现这个方法,从常理考虑可以申请一个新空间,然后将字符串的从尾到头依次填充该空间,最后新空间的内容就是反转后的结果了,这个方式的算法复杂度是O(n),并且还需要 ...
- Linux文件的加压缩解压缩tar命令
linux下使用tar命令 解压 语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用.主选项:c 创建新的档案 ...
- 安装wget 、 wget命令
今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装. 可以通 ...
- Centos镜像下载地址
https://blog.csdn.net/weixin_42430824/article/details/81019039