一、函数原型

OpenCV中phase函数计算方向场

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

该函数的值域为OpenCV中phase函数计算方向场可以通过对负数结果加OpenCV中phase函数计算方向场的方法,将函数的结果映射到OpenCV中phase函数计算方向场范围内。

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

 OpenCV中phase函数计算方向场

二、小实验

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函数计算方向场。由此可以看出opencv phase计算出的角度从0°-360°是已x轴正方向为0°,逆时针旋转增加,符合我们平常角度的计算方式。

 

三、实际运用

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

原始图像OpenCV中phase函数计算方向场

代码    

 //变量

    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一行,角度就已经求出来了,后面是为了方便显示。

OpenCV中phase函数计算方向场

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

 

 

目前方向:图像拼接融合、图像识别 联系方式:[email protected]

相关文章:

  • 2021-05-01
  • 2022-12-23
  • 2021-07-25
  • 2022-12-23
  • 2021-05-14
  • 2021-12-07
  • 2021-06-14
猜你喜欢
  • 2022-02-09
  • 2021-05-27
  • 2022-01-05
  • 2021-11-26
  • 2022-12-23
  • 2021-11-12
  • 2021-11-01
相关资源
相似解决方案