1. #include<opencv2/core/core.hpp>
  2. #include<opencv2/highgui/highgui.hpp>
  3. #include<opencv2/imgproc/imgproc.hpp>
  4. #include<iostream>
  5.  
  6. // center:极坐标的变换中心
  7. // minr:变换中心的最小距离
  8. // mintheta:最小距离
  9. // thetaStep:角度的变换步长
  10. // rStep:距离的变换步长
  11. cv::Mat polar(cv::Mat I,cv::Point2f center,cv::Size size,float minr=,float mintheta=,float thetaStep=1.0/,float rStep=1.0){
  12. cv::Mat ri=cv::Mat::zeros(cv::Size(,size.height),CV_32FC1);
  13. for(int i=;i<size.height;++i)
  14. ri.at<float>(i,)=minr+i*rStep;
  15. cv::Mat r=cv::repeat(ri,,size.width);
  16. cv::Mat thetaj=cv::Mat::zeros(cv::Size(size.width,),CV_32FC1);
  17. for(int i=;i<size.width;++i)
  18. thetaj.at<float>(,i)=mintheta+i*thetaStep;
  19. cv::Mat theta=cv::repeat(thetaj,size.height,);
  20. cv::Mat x,y;
  21. cv::polarToCart(r,theta,x,y,true);
  22. x+=center.x;
  23. y+=center.y;
  24. cv::Mat dst =*cv::Mat::ones(size,CV_8UC1);
  25. for(int i=;i<size.height;++i){
  26. for(int j=;j<size.width;++j){
  27. float xij=x.at<float>(i,j);
  28. float yij=y.at<float>(i,j);
  29. int nearestx=int(round(xij));
  30. int nearesty=int(round(yij));
  31. if((<=nearestx&&nearestx<I.cols)&&(<=nearesty&&nearesty<I.rows))
  32. dst.at<uchar>(i,j)=I.at<uchar>(nearesty,nearestx);
  33. }
  34. }
  35. return dst;
  36. }
  37.  
  38. int main(){
  39. cv::Mat I=cv::imread("/home/nan/图片/openimage/circleWithText.jpg",cv::IMREAD_GRAYSCALE);
  40. if(!I.data) return -;
  41. float thetaStep=1.0/; // thetaStep=0.25代表整个圆环,thetaStep=0.5代表半个圆环,thetaStep=1代表1/4个圆环。
  42. float minr=;
  43. cv::Size size (int(/thetaStep),); //50:圆环文字的大致高度。
  44. // 圆环角度范围为(0,360),输出圆环图像的宽度为(360/thetaStep):
  45. cv::Mat dst=polar(I,cv::Point2f(,),size,minr);
  46. //cv::imshow("极坐标变换0:",dst);
  47. cv::flip(dst,dst,); // 0 meansflipping around the x-axis and positive value (for example, 1) means
  48. // flipping around y-axis. Negative value (for example, -1) means flipping around both axes.
  49. cv::imshow("I",I);
  50. cv::imshow("最近邻插值极坐标变换:",dst);
  51.  
  52. cv::linearPolar(I,dst,cv::Point2f(,),,cv::INTER_LINEAR);
  53. cv::imshow("线性插值极坐标变换:",dst);
  54.  
  55. cv::logPolar(I,dst,cv::Point2f(,),,cv::WARP_FILL_OUTLIERS);
  56. cv::imshow("对数极坐标变换:",dst);
  57. //cv::InterpolationFlags
  58. cv::waitKey();
  59. return ;
  60. }

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. akka-typed(1) - actor生命周期管理

    akka-typed的actor从创建.启用.状态转换.停用.监视等生命周期管理方式和akka-classic还是有一定的不同之处.这篇我们就介绍一下akka-typed的actor生命周期管理. 每 ...

  2. SpringBoot—自定义线程池及并发定时任务模板

    介绍   在项目开发中,经常遇到定时任务,今天通过自定义多线程池总结一下SpringBoot默认实现的定时任务机制. 定时任务模板 pom依赖 <dependencies> <dep ...

  3. ASP.NET Core WebAPI实现本地化(单资源文件)

    在Startup ConfigureServices 注册本地化所需要的服务AddLocalization和 Configure<RequestLocalizationOptions> p ...

  4. PMP | 备考笔记

    (持续更新......) 五大过程组和十大知识领域是PMP的重要组成部分,也是这门课的重点线索,本文会逐步迭代.渐进明细的来补充完善这个体系. (先放个图吧) 以下每个模块记录自己有点模糊的地方 项目 ...

  5. 【Mybatis】mybatis开启Log4j日志、增删改查操作

    Mybatis日志(最常用的Log4j) 官方网站http://www.mybatis.org/mybatis-3/zh/logging.html 1.在src目录下创建一个log4j.propert ...

  6. Java实现 蓝桥杯 历届试题 斐波那契

    试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...

  7. Java实现 蓝桥杯 算法训练 前缀表达式

    算法训练 前缀表达式 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:"运算符 对象1 对象2", ...

  8. Java实现 蓝桥杯VIP 算法提高 十进制转八进制数

    import java.util.Scanner; public class 十进制转八进制 { public static void main(String[] args) { Scanner sc ...

  9. CSDN账号被冻结了怎么办

    CSDN可能因为你的博客里有一些网站链接给你判断为恶意推广广告,冻结, 或者和我一样,在评论区刷屏被冻结, 联系客服即可,向客服提供你的绑定邮箱或绑定手机号,或博客id,客服会给你解冻 PS: 找不到 ...

  10. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...