学习OpenCv 极坐标的转换ch6_ex6_4 Log-polar transform example

对数极坐标图像几何学首先是从生物视觉系统的视网膜生理结构获得灵感的,具有数据压缩特性。在人工视觉系统中,与常见的笛卡尔坐标系中的图像对比,在没有减小视域大小和视网膜中心部分图像的分辨率的情况下,对数极坐标图像允许更加快速的采样率。 
有关对数极坐标的描述:https://blog.csdn.net/carson2005/article/details/7185552
个人理解:
将图像(图像上的各个点(像素))重新映射到半对数极坐标空间,即:选定参考点,通常是中心点如圆心、直方图中心点;横坐标为半径(该点到参考点的距离)取对数,纵坐标为角度,通常是顺时针沿着水平横向坐标旋转的角度。具体细节如下所示:
                        
     
 以上图b):取C点圆心为参考点,A(XA,YA)点为通常直角坐标系上的图像上待映射的一个像素点,沿着水平横向坐标旋转的角度为60°,可用angle°=arctan(dy/dx)计算,距离中心点最远点的距离为maxRadius。I=(dx,dy)为像素点的偏移量,Kx,Ky为行列的偏移定值,只与与原图像相关。ρ、ϕ分别为极坐标的横纵向坐标,分别表示距离中心点的偏移量和角度。具体转换如下:
                       
 

实例:

#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)
{
    IplImage* src;
   double M; 
    if( argc == 3 && ((src=cvLoadImage(argv[1],1)) != 0 ))
    {
      M = atof(argv[2]);
        IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );
        IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 );
        cvLogPolar( src,  dst, cvPoint2D32f(src->width/2,src->height/2),  
                    M, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
        cvLogPolar( dst, src2, cvPoint2D32f(src->width/2,src->height/2),
                    M, CV_INTER_LINEAR+CV_WARP_INVERSE_MAP );
        cvNamedWindow( "log-polar", 1 );
        cvShowImage( "log-polar", dst );
        cvNamedWindow( "inverse log-polar", 1 );
        cvShowImage( "inverse log-polar", src2 );
		cvNamedWindow( "src picture", 1 );
        cvShowImage( "src picture", src );
        cvWaitKey();
    }
    return 0;
}

                                                                

                                                                

                                                                 
                        

猜你喜欢

转载自blog.csdn.net/cindywry/article/details/86003351
今日推荐