LogPolar 对数极坐标

cvLogPolar

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

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

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

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

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

1477747281047.jpg

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

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

1477747476479.jpg

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

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 标志位,未设置表示转换成极坐标,设置表示由极坐标变回直角坐标 

示例:

测试图像

1477748420908.jpg

代码

  1. #include "highgui.h" 

  2. #include "cv.h" 


  3. int main(int argc, char** argv) 



  4. IplImage* img = cvLoadImage(argv[1]); 

  5. cvNamedWindow("Origin"); 

  6. cvShowImage("Origin", img); 

  7. IplImage* out = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels); 

  8. cvLogPolar(img, out, cvPoint2D32f(img->width / 2, img->height / 2), 40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS); 

  9. cvNamedWindow("logPolar"); 

  10. cvShowImage("logPolar", out); 

  11. IplImage* back = cvCreateImage(cvGetSize(img), img->depth, img->nChannels); 

  12. cvLogPolar(out, back, cvPoint2D32f(img->width / 2, img->height / 2), 40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS + CV_WARP_INVERSE_MAP); 

  13. cvNamedWindow("Reconstructure");  

  14. cvShowImage("Reconstructure", back); 

  15. cvWaitKey(0); 

  16. cvReleaseImage(&img); 

  17. cvDestroyWindow("Origin"); 

  18. cvReleaseImage(&out); 

  19. cvDestroyWindow("logPolar"); 

  20. cvReleaseImage(&back); 

  21. cvDestroyWindow("Reconstructure"); 




得到结果图像:

1477748496562.jpg

1477748523093.jpg

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

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

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

1477748755693.jpg

1477748781963.jpg

参考:

Log-Polar——关于对数极坐标

LogPolar

matlab练习程序(Log Polar变换)

LogPolar 对数极坐标的更多相关文章

  1. (转)OpenCV 基本知识框架

    以下是对<学习OpenCV>一书知识框架的简单梳理 转自:http://blog.chinaunix.net/uid-8402201-id-2899695.html 一.基础操作      ...

  2. opencv C++极坐标变换

    #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv ...

  3. Image Processing and Analysis_15_Image Registration:Image registration methods a survey——2003

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  4. <学习opencv> opencv 概述及初探

    目录 Opencv3 当前模块 OpenCV 贡献库(opencv_contrib) OpenCV 头文件 旧式C风格头文件 新式C++风格头文件 例程 DEMO1 - 显示图片 DEMO2 - 视频 ...

  5. 视频文件写入转换之图像处理-OpenCV应用学习笔记五

    在<笔记二>中我们做了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操作:今天我们来一起练习下对视频文件的写入操作:格式转换. 实现功能: 打开一个视频文件play.avi,读取文件 ...

  6. OpenCV 3.0函数库索引

    ================================== 前言:值的个数: cvCrossProduct:计算两个三维向量的向量积(叉积): cvCvtColor:将数组的通道从一个颜色空 ...

  7. [OpenCV] IplImage and Functions

    In this chapter, APIs will make U crazy. Good luck! Next, Review Linear Algebra.  Ref: http://blog.c ...

  8. OpenCV中的常用函数

    1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序 ...

  9. Opencv 函数

    1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序 ...

随机推荐

  1. 要学Java,怎么高效地学习,怎么规划

    要学Java,怎么高效地学习,怎么规划?   题主是一个个例,99%的人(包括我自己)都没有题主这样的经历,也很难提出具有很强参考性的java学习建议.我倒是之前面试过一个跟题主有点类似的人,拿出来分 ...

  2. centos ab命令安装

    yum install apr-util -ymkdir abcd abyum -y install yum-utils -yyumdownloader httpd yum localinstall ...

  3. Google map markers

    现已被屏蔽 http://mabp.kiev.ua/2010/01/12/google-map-markers/ Надо по немногу отходить от празднывания но ...

  4. 你想的到想不到的 javascript 应用小技巧方法

    javascript 在前端应用体验小技巧继续积累. 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElemen ...

  5. Login Reference for PhotoSomething

    Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial http://www.vogella. ...

  6. APP注释代码

    <meta name="viewport" content="width=device-width,height=device-height,inital-scal ...

  7. mount -t nfs 的使用

    服务安装:1. 在VMware Ubuntu中安装NFS服务: sudo apt-get install nfs-kernel-server2. 安装成功会出现配置文件/etc/exports. ls ...

  8. Yslow-23条规则

    1. 减少HTTP请求次数 合并图片.CSS.JS,减少首次访问用户等待时间. 2. 使用CDN就近缓存==>智能路由==>负载均衡==>WSA全站动态加速 3. 避免空的src和h ...

  9. bzoj1023: [SHOI2008]cactus仙人掌图

    学习了一下圆方树. 圆方树是一种可以处理仙人掌的数据结构,具体见这里:http://immortalco.blog.uoj.ac/blog/1955 简单来讲它是这么做的:用tarjan找环,然后对每 ...

  10. Windows10+Ubuntu双系统安装 (转)

    1.Windows10+Ubuntu双系统安装:   http://www.jianshu.com/p/2eebd6ad284d 2.UEFI启动模式安装ubuntu指南  :  http://col ...