zoukankan      html  css  js  c++  java
  • LogPolar 对数极坐标

    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变换)

  • 相关阅读:
    eclipse bookmark
    java 生成有模板表单域的 PDF
    bootstrapValidator Maximum call stack size exceeded
    CREATE DATABASE
    mysql foreign key 外键
    老毛桃修复系统
    在PHP中PDO解决中文乱码问题
    恢复root用户目录,及~目录
    phpmyadmin自增字段
    PS 色彩的色相谱
  • 原文地址:https://www.cnblogs.com/YiXiaoZhou/p/6011919.html
Copyright © 2011-2022 走看看