博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV中phase函数计算方向场
阅读量:6987 次
发布时间:2019-06-27

本文共 1228 字,大约阅读时间需要 4 分钟。

一、函数原型

​该函数
参数
angleInDegrees
默认为false,即弧度,当置为true时,则输出为角度。
phase函数根据函数
来计算角度,计算精度大约为0.3弧度,当x,y相等时,angle为0。
数学上函数atan2为:

该函数的值域为可以通过对负数结果加的方法,将函数的结果映射到范围内。

而c++中atan2函数是通过正切值返回弧度的,并通过判断x,y的正负决定象限,因此c++中atan2函数值域是从-Pi到Pi的。

 

二、小实验

Mat mat1(Size(
4
,
1
), CV_32FC1), mat2(Size(
4
,
1
), CV_32FC1), mat3;
mat1.at
<
float
>
(
0
,
0
)
=
1
;  mat2.at
<
float
>
(
0
,
0
)
=
1
;
mat1.at
<
float
>
(
0
,
1
)
=
1
;  mat2.at
<
float
>
(
0
,
1
)
=
-
1
;
mat1.at
<
float
>
(
0
,
2
)
=
-
1
; mat2.at
<
float
>
(
0
,
2
)
=
1
;
mat1.at
<
float
>
(
0
,
3
)
=
-
1
; mat2.at
<
float
>
(
0
,
3
)
=
-
1
;
phase(mat1,mat2,mat3,
true
);

 

最后mat3的计算结果:。由此可以看出opencv phase计算出的角度从0°-360°是已x轴正方向为0°,逆时针旋转增加,符合我们平常角度的计算方式。

 

三、实际运用

使用函数来计算图像方向场

原始图像

代码    

 //变量

    Mat img = cv::imread"e:/template/***。png",0); 
    Mat grad1,grad2,angle;
    Sobel(imggrad1CV_64FC1, 1, 0); //求梯度
    Sobel(imggrad2CV_64FC1, 0, 1);
    blur(grad1,grad1,Size(6,6));
    blur(grad2,grad2,Size(6,6));
    phase(grad1grad2angletrue); //求角度
    normalize(angleangle, 0, 255, NORM_MINMAX); //归一化 方便显示,和实际数据没有关系
    angle.convertTo(angle,CV_8UC1);
    

说明

在进行角度计算之前,对sobel计算的两个结果分别进行了6*6的平均卷积,这是基本的去噪思路。而后到phase一行,角度就已经求出来了,后面是为了方便显示。

注意,这里的角度是以x正方向为0,以逆时针为正方向,0-360的度量。并且显而易见分了内外。这个圆是比较简单的,如果对于复杂图像,就必须对角度的概念有深入理解。

 

 

转载地址:http://akzvl.baihongyu.com/

你可能感兴趣的文章
写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串...
查看>>
linux安装mysql
查看>>
第一篇:尽量多的以 const/enum/inline 替代 #define
查看>>
第十五篇:C程序的存储空间布局
查看>>
飞得更高: (一)陌生电话
查看>>
哪些年是闰年
查看>>
【手把手教你Maven】构建过程
查看>>
【JSP EL】EL表达式获取当前时间(两种方式)
查看>>
记一次生产环境axis2服务特别慢的问题。
查看>>
@Linux下Redis的安装
查看>>
一步一步实现字母索引导航栏
查看>>
解决哈希冲突常用的两种方法是:开放定址法和链地址法
查看>>
CentOS 7 安装Boost 1.61
查看>>
artTemplate模板引擎学习实战
查看>>
HttpPost+json请求---服务器中文乱码及其他
查看>>
tomcat 8 加 struts2的 java.lang.NoSuchFieldException: resourceEntries
查看>>
Docker 常用命令
查看>>
JVM调优之---一次GC调优实战
查看>>
三.微信授权
查看>>
Python内置的urllib模块不支持https协议的解决办法
查看>>