LogPolar 对数极坐标 | 您所在的位置:网站首页 › origin设置对数坐标 › LogPolar 对数极坐标 |
LogPolar 对数极坐标cvLogPolar 对数极坐标(logpolar)是仿真生物视网膜中央凹陷的特性,具有数据压缩的能力,可用于目标跟踪中快速尺度和旋转变换不变的模板匹配。 对数极坐标其实就是将图像像素坐标转换成极坐标,然后对r求取对数,获得的坐标。 直角坐标系和极坐标系的变换公式为: ![]() ![]() 具体过程是怎么样的呢?首先要选定坐标原点,然后才能变换。一般坐标原点选为图像的中心点,如果直接对每一个像素点计算对应的 所以在转换计算时,使用如下图类似的结构。 ![]() 这个结构包含32个同心圆,每个同心圆上有64个区域,其中径向上相邻的区域大小变化时线性的,距离中心越远,区域越大。 在变换时,每个区域计算均值,然后该区域转换到 ![]() 如果我们将得到的 ![]() 由于图像都是矩阵,没有环形的,所以在转换过程中,肯定会碰到超出图像边界的区域,这时候采用0值替代。 OpenCV中logpolar转换函数为 void cvLogPolar(const CvArrsrc, CvArr dst, CvPoint2D32f center,double M,int flags)
src: 输入图像
dst: 输出图像
center: 设置的坐标原点位置
M: 尺度参数 示例: 测试图像 ![]() 代码 #include "highgui.h" #include "cv.h" int main(int argc, char** argv) { IplImage* img = cvLoadImage(argv[1]); cvNamedWindow("Origin"); cvShowImage("Origin", img); IplImage* out = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels); cvLogPolar(img, out, cvPoint2D32f(img->width / 2, img->height / 2), 40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS); cvNamedWindow("logPolar"); cvShowImage("logPolar", out); IplImage* back = cvCreateImage(cvGetSize(img), img->depth, img->nChannels); cvLogPolar(out, back, cvPoint2D32f(img->width / 2, img->height / 2), 40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS + CV_WARP_INVERSE_MAP); cvNamedWindow("Reconstructure"); cvShowImage("Reconstructure", back); cvWaitKey(0); cvReleaseImage(&img); cvDestroyWindow("Origin"); cvReleaseImage(&out); cvDestroyWindow("logPolar"); cvReleaseImage(&back); cvDestroyWindow("Reconstructure"); }得到结果图像: ![]() ![]() 可以发现中间分辨率还是可以的,但是周围显然模糊了好多。 当然还可以设置不同的中心位置,和不同的尺度参数。 内部不设置插值方式的结果 ![]() ![]() 参考: Log-Polar——关于对数极坐标 LogPolar matlab练习程序(Log Polar变换) |
CopyRight 2018-2019 实验室设备网 版权所有 |