LogPolar 对数极坐标

LogPolar 对数极坐标

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

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

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

1027162-20161029214930437-1675136321.png
1027162-20161029214930859-591272015.png

1027162-20161029214931203-2028949001.png

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

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

enter description here

1477747281047.jpg

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

在变换时,每个区域计算均值,然后该区域转换到1027162-20161029214932687-1027828152.png坐标下,就获得1027162-20161029214933109-1828488150.png的矩阵,如下图示意

enter description here

1477747476479.jpg

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

enter description here

1477747569455.jpg

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

OpenCV中logpolar转换函数为

void cvLogPolar(const CvArrsrc, CvArr dst, CvPoint2D32f center,double M,int flags)
src: 输入图像
dst: 输出图像
center: 设置的坐标原点位置
M: 尺度参数 1027162-20161029214935484-393345983.png
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变换)

转载于:https://www.cnblogs.com/YiXiaoZhou/p/6011919.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值