点击上方“Python数据之道”,选择“星标公众号”

收藏文章的同时,不要忘记「在看

媲美 PS,

用 Python 制作酷炫极坐标全景图

0 概述 

今天要分享的一个实用技术是“极坐标全景图

首先,我们来科普一下,什么是全景图

全景,通常是指符合人的双眼正常有效视角(大约水平90度,垂直70度)或包括双眼余光视角(大约水平180度,垂直90度)以上,乃至360度完整场景范围拍摄的照片。传统的光学摄影全景照片,是把90度至360度的场景((柱形全景))全部展现在一个二维平面上,把一个场景的前后左右一览无余地推到观者的眼前,更有所谓"完整"全景(球形全景),甚至将头顶和脚底都"入画"了。随着数字影像技术和Internet技术的不断发展,可以用一个专用的播放软件在互联网上显示,并使用户用鼠标和键盘控制环视的方向,可左可右可近可远。使您感到就在环境当中,您好像在一个窗口中浏览外面的大好风光。拍摄全景照片需要很复杂的技术,而今天我们用Photoshop就可以轻松的处理出全景特效图片。

参考:

http://www.16xx8.com/plus/view.php?aid=8095&pageno=all

好吧,文字内容太长了,直接上图吧。

此时此刻我想大家应该有个基本的概念,我们要做什么事吧。

是的,我们今天就是要完成上面图片的效果,但是像上面所说的需要PS技术才能完成吗?

不存在的。

今天我们将用代码实现上面的效果。是不是非常的装逼?

本文将从极坐标变换的原理、代码实现和注意点等几个方面进行详细的讲解,看完之后,我想大家收获的不只是ctrl+c和ctrl+v的使用,而是我的天,原来图像技术,数学可以这样子玩,我要好好跟着小编一起学习进步

1 基本原理

下图展示一张沙滩场景拍摄的图片,在两个方向【上和下】进行极坐标变换后的效果。

通过对拍摄到的照片转变成炫酷的极坐标全景图。

首先我们从数学的角度去分析,上图到底是如何转换的:

上图是从一张正常拍摄的图片转换到极坐标全景图的示意图。

这里需要说明一下,虽然极坐标图中的点应该使用半径R与角度θ表示,但是由于极坐标图的展示还是在平面直角坐标系里面,所以在进行构造极坐标图的时候,其最终生成的图像仍然使用平面直角坐标系表示。

直角坐标图【原图】 ——>极坐标图【变换后图】——>直角坐标表示【变换后图】

具体思路:已知原图中每个点(M)的灰度值,通过极坐标系与平面直角坐标系的坐标转换公式,确定极坐标图中每个点(M’)处的灰度值.

假设原图尺寸(2*a,b)

步骤一:在极坐标图中M’的极坐标定位:

从数学公式上的对应关系来看

从直角坐标系的坐标【已知,M(x, y)】变换到极坐标的坐标【待求解M(x’, y’ )】变换对应关系为:

在极坐标系中

θ = 2 * π * M的横坐标 / 原图像的宽 = 2 * π * x / b;

r = 半径缩放系数 * M的纵坐标 = ρ * y;其中:ρ = 极坐标图的R / 原图像的高 = R / (2 * a);

步骤二:将极坐标图中的极坐标,转换为极坐标图中的平面直角坐标

拥有了上面的计算公式,我们便可以找到每一个直角坐标系中的点经过极坐标变换后在极坐标系中对应的位置。当然求出 角度θ 和半径r后还需要转换为极坐标图中的平面直角坐标【显示需要】

计算公式为:

步骤三:将M处的灰度值,赋给M'处像素点的灰度值;

参考:https://zhuanlan.zhihu.com/p/29218780

这里作者还给予了一些优化的方法,对图像进插值和alpha融合等使其效果更佳。

https://blog.csdn.net/atlantistin/article/details/89373521

2  代码实现 

知道大致原理之后我们便可以去用代码去实现我们的目标了

这里我使用的环境是 python3.6,opencv3.4.2

导入必要的库

import numpy as npimport mathimport cv2

关键代码讲解:

# 准备工作,计算原图像尺寸和变换后的图片大小x0 = img.shape[0]y0 = img.shape[1]# 最大半径计算radius = int(y0/(2*math.pi))w=2*radiush=2*radiuswrapped_img = 255*np.ones((w, h, 3), dtype="u1")except_count = 0for j in range(y0):    # 1. 求极坐标系中对应的角度theta    theta = 2 * math.pi * (j /y0)      # print(theta)    for i in range(x0):      # 2.1 计算半径缩放系数        wrapped_radius = -(i-x0)*radius/x0        # 2.2 利用对应关系进行换算        y = wrapped_radius * math.cos(theta) + radius          x = wrapped_radius * math.sin(theta) + radius        x, y = int(x), int(y)        try:            # 3. 将M处的灰度值,赋给M'处像素点的灰度值            wrapped_img[x, y, :] = img[i, j, :]             # 注意点,在数学坐标系中的坐标与数字图像中的坐标表示存在差异需要注意        except Exception as e:            except_count = except_count + 1

效果展示:

3 总结

这是个看似简单的代码,但是在我自己动手实现的过程中也是遇到了不少麻烦,从原理的理解到自己动手去实现花费了不少功夫,以下是我总结的一些注意点和不足之处。

(1)数学中的直角坐标与数字图像表示中的直接坐标是不同的;

(2)图片转换到极坐标图中,其原点并非是圆心的位置,而是经过一个偏移,偏移量一般为x和y方向移动半径 R 的距离

(3)从原图到极坐标图像的转换中,并非所有点均可以一一对应,这里我采用的方法是将原图的尺寸扩大一倍,来增加对应点,原作者提到的采用插值操作进行优化有异曲同工之妙

(4)接缝处存在比较明显的拼接痕迹,这里我采用ROI进行平滑,但是效果不好,原作者对原图的前后侧边采用alpha融合优化,这里还需要优化,欢迎后续同学有更好的方案分享学习。

(5)同理将极坐标变换后的图片展开其原理是类似的,这里就不多叙述。

代码链接:

https://github.com/DWCTOD/AI_study/tree/master/%E5%90%88%E6%A0%BC%E7%9A%84CV%E5%B7%A5%E7%A8%8B%E5%B8%88/%E5%AE%9E%E6%88%98%E7%AF%87/opencv/%EF%BC%88%E5%9B%9B%EF%BC%89%E5%AE%9E%E7%8E%B0%E7%82%AB%E9%85%B7%E7%9A%84%E5%85%A8%E6%99%AF%E5%9B%BE%E6%95%88%E6%9E%9C

本文来源

作者 | 神秘的铁头娃

来源 | AI算法与图像处理

-------------------End-------------------

Python数据之道 

让数据更有价值

回复 “600”,

获取《Python知识手册》

  • 推荐 | 免费获取《Python知识手册》

  • Matplotlib最有价值的50个图表

  • 可视化神器推荐(Plotly Express)

  • 推荐一个牛逼的生物信息库-Dash Bio

  • 用Python快速分析和预测股票价格

微信交流:后台回复 “wechat”加个人微信 。

同学们,支持就请右下角点

opencv极坐标转换成直角坐标_媲美 PS,用 Python 制作酷炫极坐标全景图相关推荐

  1. Python 图像 一样大小_媲美 PS,用 Python 制作酷炫极坐标全景图

    点击上方"Python数据之道",选择"星标公众号" 收藏文章的同时,不要忘记「在看」 媲美 PS, 用 Python 制作酷炫极坐标全景图 0 概述  今天要 ...

  2. 专属微信二维码python制作_教你使用Python制作酷炫二维码

    这篇文章讲的是如何利用python制作狂拽酷炫吊炸天的二维码,非常有趣哦! 可能你见过的二维码大多长这样: 稍微好看点的长这样: 普普通通,平平凡凡,没什么特色... 但,如果二维码长这样呢! 或者这 ...

  3. python制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画

    1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究,公 ...

  4. python词云图素材_用Python制作酷炫词云图,原来这么简单!

    一.简介 词云图是文本挖掘中用来表征词频的数据可视化图像,通过它可以很直观地展现文本数据中地高频词:! 图1 词云图示例 在Python中有很多可视化框架可以用来制作词云图,如pyecharts,但这 ...

  5. python词云图制作壮观天体照_用Python制作酷炫词云图,原来这么简单!

    二.利用wordcloud绘制词云图 wordcloud 是Python中制作词云图比较经典的一个模块,赋予用户高度的自由度来创作词云图: 图2 wordcloud制作词云图示例2.1 从一个简单的例 ...

  6. python画创意图形_用Python制作酷炫图形之如意金箍棒_颜色增加模块应用

    如何简单地用Python编程绘制酷炫的图形呢?通常初入门者用Python的海龟画图模块绘制图形.我们只要导入海龟模块,就像下面这样,然后让海龟前进,就能画一个"一"字图形了. im ...

  7. 如何把幻灯片ppt转换成视频_百度经验

    如何把幻灯片ppt转换成视频_百度经验 Powerpoint 2010直接转PPT为视频文件_天极网

  8. python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...

    说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...

  9. 【有利可图网】PS实战教程52:巧用PS设计打造一个酷炫的喷溅海报特效!

    本篇教大家如何巧用PS设计打造一个酷炫的喷溅海报特效教学!教程主要是运用到了蒙版和笔刷技巧,学习掌握,可以灵活运用到其它设计中,感兴趣的童鞋赶快收走试试看,需转学起来吧!

最新文章

  1. 求求你不要在用!=null判空了
  2. python人脸识别plc_三个Python项目实战,打造人脸识别系统!
  3. 学习笔记第二十五节课
  4. centos国内yum源
  5. Python 堡垒机介绍
  6. tensorflow 里metrics_深入理解TensorFlow中的tf.metrics算子
  7. delete优化_深入理解JIT和编译优化
  8. PHP用substr截取字符串出现中文乱码问题用mb_substr
  9. 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
  10. ATmega128单片机](熔丝修改后无法烧录程序情况)
  11. 应用于手机触摸屏中的电容式触摸芯片
  12. AXD 调试经验,使用及问题
  13. fox邮箱新建的服务器,foxmail新建账户创建其他邮箱的操作步骤
  14. springmvc视图解析器详解
  15. 控制器分析-绘制伯德图
  16. HDU 4043 FXTZ II
  17. javaweb成语接龙
  18. Android 获取指定图片或文件的大小
  19. 第四周小组作业:WordCount优化
  20. 四阶代数余子式怎么求_四阶行列式的计算-四阶行列式详细的计算

热门文章

  1. Redis作者的公开信:开源维护者的挣扎和无奈
  2. 自律到极致-人生才精致「第5期」:领奖通知
  3. 这些好用的网站,看看你都收藏了没!
  4. java明星养成游戏_#IT明星不是梦#Java14不得不知的5个新功能
  5. java 圈复杂度_关于Java:降低Switch语句的循环复杂度-Sonar
  6. php操作mysql数据库的扩展有哪些_8.PHP操作MySQL数据库(Mysqli扩展)
  7. 处理点云数据 点云与生成前视图
  8. CMAKE_C_COMPILER not set
  9. retinaface人脸姿态
  10. python top k问题