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. ElasticSearch-5.0安装head插件

    环境 Windows10企业版X64 JDK-1.8 ElasticSearch-5.0.0 node-v4.5.0-x64.msi git客户端 步骤 安装node到D盘.如D:\nodejs. 把 ...

  2. Windows远程数据同步工具cwRsync

    1. cwRsync简介cwRsync是Rsync在Windows上的实现版本,Rsync通过使用特定算法的文件传输技术,可以在网络上传输只修改了的文件.cwRsync主要用于Windows上的远程文 ...

  3. Redis总结(四)Redis 的持久化

    前面已经总结了Redis 的安装和使用今天讲下Redis 的持久化. redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来 ...

  4. centos7删除自带openjdk

    一些开发版的centos会自带jdk,我们一般用自己的jdk,把自带的删除.先看看有没有安装java -version [root@java-test-01 ~]# java -version ope ...

  5. js自动闭合html标签,自动补全html标记

    假如我有一个DIV,如果没有闭合后面的样式都会乱了,这样的代码可能会影响后面的样式,我希望用js去自动闭合这种没有闭合的标签: 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  6. Pandas-数据整理

    Pandas包对数据的常用整理功能,相当于数据预处理(不包括特征工程) 目录 丢弃值 drop() 缺失值处理 isnull() & notnull() dropna() fillna() 值 ...

  7. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  8. idea之internal java compiler error

    启动错误:Error:java: Compilation failed: internal java compiler error 解决:将圈选地方改为对应的jdk版本即可

  9. IIS 输入地址 目录浏览

  10. PDO 用法学习

    PDO: php data object数据库访问抽象层 基于驱动:1.安装扩展 php_pdo.dll2.安装驱动 php_pdo_mysql.dll linux 编译时参数:--with-pdo= ...