基于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 这个是维基百科中的链接, ...
随机推荐
- [原创]在Windows平台使用msys2、mingw64和vscode编写和调试C/C++代码
相关名词就不解释了,这里主要讲讲在vscode里怎么配,这里假设大家相关工具已经装好. 题外话:里面的大多数坑都是windows平台和linux平台的差异造成的,如果在linux平台配置,应该会顺利很 ...
- iOS 中通过kvc 获取数组的均值、求和、最大最小值等
NSArray *values = @[@, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @]; NSNumber *avg = [values valu ...
- vmware添加新硬盘磁盘扫描脚本
#! /bin/bash echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > ...
- ACM-ICPC 2017 沈阳赛区现场赛 G. Infinite Fraction Path && HDU 6223(BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6223 参考题解:https://blog.csdn.net/qq_40482495/article/d ...
- QT 设置应用程序图标和可执行程序图标
1, 首先准备个ICO图标.例如:myappico.ico 在工程目录下新建images文件夹并你的图标myappico.ico(只能用ico格式的图片)放到工程目录下的images文件夹下 2, 用 ...
- eclipse找不到JadClipse问题
版本信息: Eclipse Java EE IDE for Web Developers. Version: 2018-09 (4.9.0) 根据以往配置,放在eclipse\plugins下不生效, ...
- HDU 6102 - GCDispower | 2017 Multi-University Training Contest 6
个人感觉题解的复杂度很玄,参不透,有没有大佬讲解一下- - /* HDU 6102 - GCDispower [ 数论,树状数组] | 2017 Multi-University Training C ...
- 【DES加密解密】 C#&JAVA通用
DES加密解密 C# Code /// <summary> /// DES加密解密帮助类 /// </summary> public static class DESHelpe ...
- MFC 模态对话框、非模态对话框
modal dialogs与modeless dialogs,modal dialogs会让原窗体不被选中,modeless dialogs原窗体依然可以选中. 1.模态对话框的显示 DlgModal ...
- 进程控制块(PCB)
进程控制块PCB 我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体. /usr/src/linux-headers- ...