在Opencv中自定义了一个相位函数,获取复数矩阵的相位
Mat& getPhase(Mat&complex) { CV_Assert(complex.channels()==2&&complex.depth()>4); int rows=complex.rows,cols=complex.cols; int depth=complex.depth(); static Mat Angle(rows,cols,depth,Scalar::all(0)); switch (depth) { case CV_32F: { float*pc=(float*)complex.data; float*pa=(float*)Angle.data; for(int i=0;i<rows*cols;i++) { if(pc[0]==0&&pc[1]>0) pa[0]=M_PI/2; else if(pc[0]==0&&pc[1]<0) pa[0]=-M_PI/2; else pa[0]=fastAtan2(pc[1],pc[0])*M_PI/180; pa+=1; pc+=2; } } break; case CV_64F: { double*pc=(double*)complex.data; double*pa=(double*)Angle.data; for(int i=0;i<rows*cols;i++) { if(pc[0]==0&&pc[1]>0) pa[0]=M_PI/2; else if(pc[0]==0&&pc[1]<0) pa[0]=-M_PI/2; else pa[0]=fastAtan2(pc[1],pc[0])*M_PI/180; pa+=1; pc+=2; } } break; } return Angle; }
void getPhase(Mat&complex,Mat&Angle) { CV_Assert(complex.channels()==2&&complex.depth()>4); int rows=complex.rows,cols=complex.cols; int depth=complex.depth(); if(Angle.empty()) Angle.create(rows,cols,depth); switch (depth) { case CV_32F: { float*pc=(float*)complex.data; float*pa=(float*)Angle.data; for(int i=0;i<rows*cols;i++) { if(pc[0]==0&&pc[1]>0) pa[0]=M_PI/2; else if(pc[0]==0&&pc[1]<0) pa[0]=-M_PI/2; else pa[0]=fastAtan2(pc[1],pc[0])*M_PI/180; pa+=1; pc+=2; } } break; case CV_64F: { double*pc=(double*)complex.data; double*pa=(double*)Angle.data; for(int i=0;i<rows*cols;i++) { if(pc[0]==0&&pc[1]>0) pa[0]=M_PI/2; else if(pc[0]==0&&pc[1]<0) pa[0]=-M_PI/2; else pa[0]=atan2(pc[1],pc[0]); pa+=1; pc+=2; } } break; } }