首页 > 技术文章 > LogPolar 对数极坐标

YiXiaoZhou 2016-10-29 21:50 原文

LogPolar 对数极坐标

对数极坐标(logpolar)是仿真生物视网膜中央凹陷的特性,具有数据压缩的能力,可用于目标跟踪中快速尺度和旋转变换不变的模板匹配。

对数极坐标其实就是将图像像素坐标转换成极坐标,然后对r求取对数,获得的坐标。

直角坐标系和极坐标系的变换公式为:

具体过程是怎么样的呢?首先要选定坐标原点,然后才能变换。一般坐标原点选为图像的中心点,如果直接对每一个像素点计算对应的坐标,首先得到的结果并不是个矩阵,其次这样之后再逆变换到图像上,信息并没有变化。

所以在转换计算时,使用如下图类似的结构。

enter description here

1477747281047.jpg

这个结构包含32个同心圆,每个同心圆上有64个区域,其中径向上相邻的区域大小变化时线性的,距离中心越远,区域越大。

在变换时,每个区域计算均值,然后该区域转换到坐标下,就获得的矩阵,如下图示意

enter description here

1477747476479.jpg

如果我们将得到的坐标下的图像再映射回直角坐标系中,那么离中心近的区域显然分辨率较高,而距离远的区域就相当于经过了均值滤波。如下图

enter description here

1477747569455.jpg

由于图像都是矩阵,没有环形的,所以在转换过程中,肯定会碰到超出图像边界的区域,这时候采用0值替代。

OpenCV中logpolar转换函数为

void cvLogPolar(const CvArrsrc, CvArr dst, CvPoint2D32f center,double M,int flags)
src: 输入图像
dst: 输出图像
center: 设置的坐标原点位置
M: 尺度参数
flag: 标志位和插值方法
CV_INTER_LINEAR 内部采用线性插值,注意由于M的存在结果可能不会相邻整数,中间需要差值,逆变换也需要插值
CV_WARP_FILL_OUTLIERS 对于超出图像边界区域如何处理

  1. CV_WARP_INVERSE_MAP 标志位,未设置表示转换成极坐标,设置表示由极坐标变回直角坐标 

示例:
测试图像

enter description here

1477748420908.jpg

代码

  1. #include "highgui.h" 
  2. #include "cv.h" 
  3.  
  4. int main(int argc, char** argv) 

  5. IplImage* img = cvLoadImage(argv[1]); 
  6. cvNamedWindow("Origin"); 
  7. cvShowImage("Origin", img); 
  8. IplImage* out = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels); 
  9. cvLogPolar(img, out, cvPoint2D32f(img->width / 2, img->height / 2), 40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS); 
  10. cvNamedWindow("logPolar"); 
  11. cvShowImage("logPolar", out); 
  12. IplImage* back = cvCreateImage(cvGetSize(img), img->depth, img->nChannels); 
  13. cvLogPolar(out, back, cvPoint2D32f(img->width / 2, img->height / 2), 40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS + CV_WARP_INVERSE_MAP); 
  14. cvNamedWindow("Reconstructure");  
  15. cvShowImage("Reconstructure", back); 
  16. cvWaitKey(0); 
  17. cvReleaseImage(&img); 
  18. cvDestroyWindow("Origin"); 
  19. cvReleaseImage(&out); 
  20. cvDestroyWindow("logPolar"); 
  21. cvReleaseImage(&back); 
  22. cvDestroyWindow("Reconstructure"); 

  23.  

得到结果图像:

enter description here

1477748496562.jpg

enter description here

1477748523093.jpg

可以发现中间分辨率还是可以的,但是周围显然模糊了好多。

当然还可以设置不同的中心位置,和不同的尺度参数。

内部不设置插值方式的结果

enter description here

1477748755693.jpg

enter description here

1477748781963.jpg

参考:
Log-Polar——关于对数极坐标
LogPolar
matlab练习程序(Log Polar变换)

推荐阅读