• OpenCV中phase函数计算方向场


    一、函数原型

    ​该函数 参数 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(img, grad1, CV_64FC1, 1, 0); //求梯度
        Sobel(img, grad2, CV_64FC1, 0, 1);
        blur(grad1,grad1,Size(6,6));
        blur(grad2,grad2,Size(6,6));
        phase(grad1, grad2, angle, true); //求角度
        normalize(angle, angle, 0, 255, NORM_MINMAX); //归一化 方便显示,和实际数据没有关系
        angle.convertTo(angle,CV_8UC1);
        

    说明

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

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

     

  • 相关阅读:
    论二级域名收集的各种姿势
    我喜欢你是寂静的-聂鲁达
    早晨充满-聂鲁达
    KALI Linux更新源
    lodash throttle和debounce
    lodash capitalize 首字母大写
    C# 格式化百分比
    c# PadLeft,PadRight用法
    对象名 XXX 无效。
    lambda 分组后的count
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/16947989.html
Copyright © 2020-2023  润新知