OpenCV中phase函数计算方向场
2017-08-28 20:08
288 查看
一、函数原型
该函数参数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的度量。并且显而易见分了内外。这个圆是比较简单的,如果对于复杂图像,就必须对角度的概念有深入理解。
该函数参数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的度量。并且显而易见分了内外。这个圆是比较简单的,如果对于复杂图像,就必须对角度的概念有深入理解。
相关文章推荐
- 利用opencv函数计算图像的梯度幅度和梯度方向
- OpenCV中phase函数计算方向场
- OpenCV中phase函数计算方向场
- Opencv中计算梯度、梯度幅值以及梯度方向的相关函数
- opencv中矩阵计算的一些函数
- OpenCv 关于矩阵的相关计算函数
- OpenCV 直方图计算函数 calcHist源码深度剖析
- opencv矩阵计算的一些函数
- opencv中3D点根据相机参数投影成2D点+solvePnP函数计算相机姿态+2D坐标到3D+相机参数calibration(标定与配准,求得深度彩色相机的内参与外参,再进行配准)
- opencv:计算数组加权和—addWeighted()函数
- opencv 2.4 中计算均值和方差的函数meanStdDev,其结果的类型
- opencv中矩阵计算的一些函数
- OpenCV3.1.0的calibrateCamera()函数计算相机内参数
- 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数
- OpenCv 关于矩阵的相关计算函数
- opencv 并行计算函数 parallel_for_的使用
- HOG算子——计算方式,opencv函数详解,行人检测code
- Excel资金日报表中根据借贷方向计算余额以及引用函数的巧妙运用
- opencv3计算变换矩阵getAffineTransform函数和进行仿射变换warpAffine函数
- OpenCV findContours 轮廓检索函数及轮廓特征计算