图像的Log-Polar极坐标变换

来源:互联网 发布:arena仿真软件下载 编辑:程序博客网 时间:2024/06/11 09:50

引言

本节介绍使用OpenCV 1.x如使 图像映射到极坐标实现。

预备知识

在opencv中,函数cvLogPolar功能是将图像映射到极坐标

格式

/* Performs forward or inverse log-polar image transform */CVAPI(void)  cvLogPolar( const CvArr* src, CvArr* dst,                         CvPoint2D32f center, double M,                         int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS));
参数

  • src 源图像
  • dst 目标图像
  • center 变换中心,此处输出精度最高。
  • M 幅度尺度参数
  • flags:为插值方法标示与下面选项的组合:
    • CV_WARP_FILL_OUTLIERS 填充目标图像中的所有像素,如果某些像素对应于源图像之我的位置,则用0填充.
    • CV_WARP_INVERSE_MAP  表示矩阵是从目标图像到源图像的反变换,因此,可以直接用于像素插值;否则,函数从map_matrix寻找变换。

说明

函数cvLogPolar使用如下变换公式对源图像进行变换。

  • 正变换(未设置CV_WARP_INVERSE_MAP时): dst(phi,rho) ← src(x,y)
  • 反变换(设置CV_WARP_INVERSE_MAP): dst(x,y) ← src(phi,rho)

其中, rho =M*log[sqrt(x2+y2)],  phi = atan(y/x).

此函数可以用来模拟人类的中央视觉(foveal vision),并可以用于物体跟踪方面的尺度及旋转不变模板的快速匹配。


参考代码

OpenCV1.x版

IplImage *ImagePixel::ImageLogPolar(IplImage* pImg,int flags){   if(!pImg){     printf("Error:Load File in ImageLogPolar(..).\n");     exit(EXIT_FAILURE);   }   nWidth = pImg->width;   nHeight = pImg ->height;      IplImage* dst = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);   cvLogPolar(pImg,dst,cvPoint2D32f(nWidth/2,nHeight/2),40,flags);    return dst;}

测试输出结果:

   

(a) 原始图像                       (b) Log-Polar正变换                 (b) Log-Polar 反变换

Python版

import sysdef on_mouse( event, x, y, flags, param ):     if( not src ):               return;     if event==CV_EVENT_LBUTTONDOWN:        cvLogPolar(src, dst, cvPoint2D32f(x,y), 40,                            CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );        cvLogPolar(dst, src2, cvPoint2D32f(x,y), 40,                            CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP );        cvShowImage( "log-polar", dst );        cvShowImage( "inverse log-polar", src2 ); if __name__ == "__main__":         filename = "test.jpg"    if len(sys.argv)>1:        filename=argv[1]         src = cvLoadImage(filename,1)    if not src:        print "Could not open %s" % filename        sys.exit(-1)             cvNamedWindow( "Original",0 );    cvNamedWindow( "Log-polar",0 );    cvNamedWindow( "inverse log-polar", 0 );            dst = cvCreateImage( cvSize(256,256), 8, 3 );    src2 = cvCreateImage( cvGetSize(src), 8, 3 );         cvSetMouseCallback( "original", on_mouse );    on_mouse( CV_EVENT_LBUTTONDOWN, src.width/2, src.height/2, None, None)         cvShowImage( "original", src );    cvWaitKey();


关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.