LogPolar 对数极坐标

时间:2022-09-30 11:19:12

LogPolar 对数极坐标

cvLogPolar

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

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

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

LogPolar 对数极坐标
LogPolar 对数极坐标

LogPolar 对数极坐标

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

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

LogPolar 对数极坐标

1477747281047.jpg

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

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

LogPolar 对数极坐标

1477747476479.jpg

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

LogPolar 对数极坐标

1477747569455.jpg

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

OpenCV中logpolar转换函数为

void cvLogPolar(const CvArrsrc, CvArr dst, CvPoint2D32f center,double M,int flags)

src: 输入图像

dst: 输出图像

center: 设置的坐标原点位置

M: 尺度参数 LogPolar 对数极坐标

flag: 标志位和插值方法

CV_INTER_LINEAR 内部采用线性插值,注意由于M的存在结果可能不会相邻整数,中间需要差值,逆变换也需要插值

CV_WARP_FILL_OUTLIERS 对于超出图像边界区域如何处理

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

示例:

测试图像

LogPolar 对数极坐标

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"); 




得到结果图像:

LogPolar 对数极坐标

1477748496562.jpg
LogPolar 对数极坐标

1477748523093.jpg

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

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

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

LogPolar 对数极坐标

1477748755693.jpg
LogPolar 对数极坐标

1477748781963.jpg

参考:

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

LogPolar

matlab练习程序(Log Polar变换)

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

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

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

  2. opencv C&plus;&plus;极坐标变换

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

  3. Image Processing and Analysis&lowbar;15&lowbar;Image Registration:Image registration methods a survey——2003

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

  4. &lt&semi;学习opencv&gt&semi; opencv 概述及初探

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

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

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

  6. OpenCV 3&period;0函数库索引

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

  7. &lbrack;OpenCV&rsqb; 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. mysql数据库导出模型到powerdesigner&comma;PDM图形窗口中显示数据列的中文注释

    1,mysql数据库导出模型到powerdesigner 2,CRL+Shift+X 3,复制以下内容,执行 '******************************************** ...

  2. 学习asp&period;net比较完整的流程&lbrack;转&rsqb;

    如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NE ...

  3. &lbrack;译&rsqb; ASP&period;NET MVC 6 attribute routing – the &lbrack;controller&rsqb; and &lbrack;action&rsqb; tokens

    原文:http://www.strathweb.com/2015/01/asp-net-mvc-6-attribute-routing-controller-action-tokens/ 当在Web ...

  4. lua if

    function fact(n) then else ) end end print("输入一个数") a=io.read("*number") print(f ...

  5. 使用 CodeIgniter 创建一个简单的 Web 站点

    原文:使用 CodeIgniter 创建一个简单的 Web 站点 参考源自: http://www.ibm.com/developerworks/cn/web/wa-codeigniter/index ...

  6. css 重新学习系列(3)

    摘自:http://www.cnblogs.com/websugar/articles/2406416.html   十步图解CSS的Position CSS的position,我想做为一个Web制作 ...

  7. Spring - bean的lazy-init属性(懒加载)

    默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的be ...

  8. js对时间的一些操作

    new Date()  //Thu Dec 27 2018 12:16:16 GMT+0800 (中国标准时间); new Date('2018-1-1,12:20:20'/1258454512000 ...

  9. oracle使用 extract获取当前时间,并比较两个时间

    --根据当前时间戳获取年月日时分秒,其中sysdate不能用于获取时分秒select systimestamp, extract(year from systimestamp) year ,extra ...

  10. jquery iframe父子框架中的元素访问方法

    在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1. 格式:window. ...