#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream> // center:极坐标的变换中心
// minr:变换中心的最小距离
// mintheta:最小距离
// thetaStep:角度的变换步长
// rStep:距离的变换步长
cv::Mat polar(cv::Mat I,cv::Point2f center,cv::Size size,float minr=,float mintheta=,float thetaStep=1.0/,float rStep=1.0){
cv::Mat ri=cv::Mat::zeros(cv::Size(,size.height),CV_32FC1);
for(int i=;i<size.height;++i)
ri.at<float>(i,)=minr+i*rStep;
cv::Mat r=cv::repeat(ri,,size.width);
cv::Mat thetaj=cv::Mat::zeros(cv::Size(size.width,),CV_32FC1);
for(int i=;i<size.width;++i)
thetaj.at<float>(,i)=mintheta+i*thetaStep;
cv::Mat theta=cv::repeat(thetaj,size.height,);
cv::Mat x,y;
cv::polarToCart(r,theta,x,y,true);
x+=center.x;
y+=center.y;
cv::Mat dst =*cv::Mat::ones(size,CV_8UC1);
for(int i=;i<size.height;++i){
for(int j=;j<size.width;++j){
float xij=x.at<float>(i,j);
float yij=y.at<float>(i,j);
int nearestx=int(round(xij));
int nearesty=int(round(yij));
if((<=nearestx&&nearestx<I.cols)&&(<=nearesty&&nearesty<I.rows))
dst.at<uchar>(i,j)=I.at<uchar>(nearesty,nearestx);
}
}
return dst;
} int main(){
cv::Mat I=cv::imread("/home/nan/图片/openimage/circleWithText.jpg",cv::IMREAD_GRAYSCALE);
if(!I.data) return -;
float thetaStep=1.0/; // thetaStep=0.25代表整个圆环,thetaStep=0.5代表半个圆环,thetaStep=1代表1/4个圆环。
float minr=;
cv::Size size (int(/thetaStep),); //50:圆环文字的大致高度。
// 圆环角度范围为(0,360),输出圆环图像的宽度为(360/thetaStep):
cv::Mat dst=polar(I,cv::Point2f(,),size,minr);
//cv::imshow("极坐标变换0:",dst);
cv::flip(dst,dst,); // 0 meansflipping around the x-axis and positive value (for example, 1) means
// flipping around y-axis. Negative value (for example, -1) means flipping around both axes.
cv::imshow("I",I);
cv::imshow("最近邻插值极坐标变换:",dst); cv::linearPolar(I,dst,cv::Point2f(,),,cv::INTER_LINEAR);
cv::imshow("线性插值极坐标变换:",dst); cv::logPolar(I,dst,cv::Point2f(,),,cv::WARP_FILL_OUTLIERS);
cv::imshow("对数极坐标变换:",dst);
//cv::InterpolationFlags
cv::waitKey();
return ;
}

opencv C++极坐标变换的更多相关文章

  1. OpenCV图像变换二 投影变换与极坐标变换实现圆形图像修正

    投影变换 在放射变换中,物体是在二维空间中变换的.如果物体在三维空间中发生了旋转,那么这种变换就成为投影变换,在投影变换中就会出现阴影或者遮挡,我们可以运用二维投影对三维投影变换进行模块化,来处理阴影 ...

  2. Photoshop和Halcon中的极坐标变换

    极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置. 我很早就接触了Photoshop,知道Photosh ...

  3. Python: PS 滤镜-- 极坐标变换到平面坐标

    本文用 Python 实现 PS 中的一种滤镜 极坐标变换到平面坐标,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/de ...

  4. OpenCV——PS 滤镜算法之极坐标变换到平面坐标

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  5. opencv之形态变换

    形态变换 在opencv之膨胀与腐蚀中介绍了Dilation/Erosion的原理.建议先读这一篇,搞懂原理. 这样就可以很轻松地理解为什么本文的这些形态变换可以取得相应的效果. 基于此,我们可以组合 ...

  6. OpenCV仿射变换+投射变换+单应性矩阵

    本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ esti ...

  7. PS 滤镜——极坐标变换到平面坐标

    %%% 极坐标到平面坐标 clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorith ...

  8. opencv::基于距离变换与分水岭的图像分割

    什么是图像分割 图像分割(Image Segmentation)是图像处理最重要的处理手段之一 图像分割的目标是将图像中像素根据一定的规则分为若干(N)个cluster集合,每个集合包含一类像素. 根 ...

  9. opencv 仿射变换 投射变换, 单应性矩阵

    仿射 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform( ...

随机推荐

  1. JVM调优总结(三)-垃圾回收面临的问题

    如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...

  2. Java中的集合类型体系(一)

    Java中的集合类型体系(一) 提问:为什么需要集合? 通常情况下,程序需要根据运行时才知道创建了多少对象.若非程序运行时,而在开发阶段,我们并不知道创建了多少对象,甚至不知道对象的准确类型,为了满足 ...

  3. python初学者笔记(2):阿拉伯数字转换成中文大写

    题:输入一个数字,转换成中文大写的写法 可运行的程序(Python 2.7.9): # -*- coding: utf-8 -*- #在python2的py文件里面写中文,必须要添加一行声明文件编码的 ...

  4. Java实现 LeetCode 540 有序数组中的单一元素(位运算入门)

    540. 有序数组中的单一元素 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数. 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 ...

  5. java实现欧拉与鸡蛋

    ** 欧拉与鸡蛋** 大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子.她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋. 欧拉随便问:"卖了多少鸡蛋呢?" 不料一个说:&qu ...

  6. Linux脚本安装包

    脚本安装包 并不是独立的软件安装包类型,常见安装的是源码包,是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简答的参数,就可以实现安装,非常类似于Windows下软件的安装方式. 安装过程(安 ...

  7. Linux文件搜索命令locate、which、grep详解

    命令locate详解 命令locate,其基本功能是在文件资料库中可以快速的搜索系统文件,占用系统资源很少,例如:locate my.cnf 还可以使用locate -i [文件名],不区分大小写进行 ...

  8. github常用的协同开发流程

    github的实用之处 对于刚刚工作的小白来说,顺利完成工作任务是首要考虑的事情,业余时间多了解了解其他的技术将有利于自己对该领域的熟悉,比如我们都拥有的github,除了在网站里查看优秀的代码,其还 ...

  9. 温故知新-多线程-深入刨析synchronized

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 synchroniz ...

  10. 实践案例丨基于ModelArts AI市场算法MobileNet_v2实现花卉分类

    概述 MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear ...