首页 > 编程语言 >python3 全景图裁剪

python3 全景图裁剪

时间:2023-07-25 16:57:51浏览次数:56  
标签:map idx 裁剪 face vals 全景图 numpy python3 size

需求:

1、将鱼眼全景图 转换为three.js 可加载的六面立方体图片

 

资料查阅:

1、目前就找到这个地方有、可能是为父搜索的姿势不对 -->前往

2、图片包含内容

 

使用到的 python 库:

1、numpy ---太大,这里用于处理图像矩阵变形,计算。 2、cv2  -- 太大, 只用到了 图像映射(将原始图像映射到变形后的矩阵。) 3、PIL --图片处理库,用于图片读写、储存、 矩阵转图片 4、

 

过程:

1、当然是先看别人写好的案例了。(自己去看,反正我是看不懂。见识浅薄)

大概解释一下我能看懂的部分吧。

1)获取到图片信息-》

2)将图片转为矩阵-》

3)把矩阵重新计算变为一张包含六个面的图片(这个东东也就只能看懂一丢丢,但是管他呢,能用就行)-》

4)将原始图片按照这个处理好的矩阵进行映射-》

5)图像保存------》》》》

6)图像裁剪成为六张独立的图(可以不考虑)

 

图片处理:

import cv2
import numpy
from numpy import pi
from PIL import Image
import sys
import os.path
import zipfile


# Convert using an inverse transformation
def generate_mapping_data(image_width):
    in_size = [image_width, int(image_width * 3 / 4)] #图像宽度数组、[总长、剪掉一条边后的总长]
    edge = in_size[0] / 4  # The length of each edge in pixels 总长1/4
 
    # Create our numpy arrays
    out_pix = numpy.zeros((in_size[1], in_size[0], 2), dtype="f4") #用于记录 球体切割成功后的数组记录
    # 生成2维空数组 【(图像剩余宽度、图像宽度、2维数组),参数类型=f4】 -------预测是为后期处理像素坐标点
    xyz = numpy.zeros((int(in_size[1] * in_size[0] / 2), 3), dtype="f4") #记录像素点的初始值
    # 生成3维空数组【图像剩余宽度 * 图片宽度 / 2,3维数组】,参数类型 = f4
    vals = numpy.zeros((int(in_size[1] * in_size[0] / 2), 3), dtype="i4") # 做球体转换用的矩阵
    # 生成3维空数组【图像剩余宽度 * 图片宽度 / 2,3维数组】,参数类型 = f4
    # Much faster to use an arange when we assign to to vals
    start, end = 0, 0  # 创建两个初始值
    rng_1 = numpy.arange(0, edge * 3) # 创建连续元素(列表)0~ 单个边长 * 3
    rng_2 = numpy.arange(edge, edge * 2) # 创建连续元素(列表)单个边长~ 单个边长 * 2
    for i in range(in_size[0]): # 循环总长度 ,记录像素不同点的信息
        # 0: back
        # 1: left
        # 2: front
        # 3: right
        face = int(i / edge) #当前循环长度 / (1/4)总长
        rng = rng_1 if face == 2 else rng_2  #当整除等于2 时,位置= 单边长度~总长的一半? || 其他时候、 位置= 0~总长(1/3)
        # print(face)
        end += len(rng) # 结束值 += 当前位置列表的长度
        vals[start:end, 0] = rng  #
        vals[start:end, 1] = i #
        vals[start:end, 2] = face #
        start = end
 
    # Top/bottom are special conditions
    j, i, face = vals.T # 矩阵转置
    face[j < edge] = 4  # top ??? 这个没理解
    face[j >= 2 * edge] = 5  # bottom  ???  这个没理解
    # Convert to image xyz
    a = 2.0 * i / edge #
    b = 2.0 * j / edge
    one_arr = numpy.ones(len(a)) # 创建元素组,元素填充值为1, 长度为a的长度
    for k in range(6): # 获取六面体的像素信息
        face_idx = face == k #数组元素取值 face 矩阵内 值等于k的数组
        # Using the face_idx version of each is 50% quicker
        one_arr_idx = one_arr[face_idx] # 取值 one_arr数组内 face == k 的值
        a_idx = a[face_idx] # 取值 a 数组内 face == k 的值
        b_idx = b[face_idx] # 取值 b 数组内 face == k 的值
 
        if k == 0:
           vals_to_use =  [-one_arr_idx, 1 - a_idx, 3 - b_idx] # [x=负one_arr_idx的值》?,y=1.0 - a_idx的值?,z = 3.0-b_idx的值?]
        elif k == 1:
           vals_to_use =  [a_idx - 3, -one_arr_idx, 3 - b_idx]
        elif k == 2:
           vals_to_use =  [one_arr_idx, a_idx - 5, 3 - b_idx]
        elif k == 3:
           vals_to_use =  [7 - a_idx, one_arr_idx, 3- b_idx]
        elif k == 4:
           vals_to_use =  [b_idx - 1, a_idx - 5, one_arr_idx]
        elif k == 5:
           vals_to_use =  [5 - b_idx, a_idx - 5, -one_arr_idx]
        print(vals_to_use[0],len(vals_to_use[0]))
        xyz[face_idx] = numpy.array(vals_to_use).T #矩阵生成并转置
      #   cubemap = cv2.remap(numpy.array(imgIn), map_x_32, map_y_32, cv2.INTER_NEAREST) # 图片重新映射,以计算好的矩阵为参数

      #   imgOut = Image.fromarray(cubemap)
      # imgOut.save('E:\\新联国际\\地产项目\\python_jb\\Bath3.jpg'.split('.')[0]+"_out.png")
      #   imgOut.show()


    # Convert to theta and pi
    x, y, z = xyz.T # 矩阵转置
    theta = numpy.arctan2(y, x) # 元素所在象限?
    r = numpy.sqrt(x**2 + y**2) # 矩阵元素的平方根,开方
    phi = numpy.arctan2(z, r) # 计算象限?
 
    # Source img coords # 原图坐标?
    uf = (2.0 * edge * (theta + pi) / pi) % in_size[0]
   # (2.0*图片4等分长度*())???
    uf[uf==in_size[0]] = 0.0 # Wrap to pixel 0 (much faster than modulus)
    vf = (2.0 * edge * (pi / 2 - phi) / pi)
 
    # Mapping matrix
    out_pix[j, i, 0] = vf
    out_pix[j, i, 1] = uf
 
    map_x_32 = out_pix[:, :, 1] 
    map_y_32 = out_pix[:, :, 0]
    return map_x_32, map_y_32
 
imgIn = Image.open('E:\\新联国际\\地产项目\\python_jb\\Bath3.jpg')
inSize = imgIn.size
 
map_x_32, map_y_32 = generate_mapping_data(inSize[0])

cubemap = cv2.remap(numpy.array(imgIn), map_x_32, map_y_32, cv2.INTER_NEAREST) # 图片重新映射,以计算好的矩阵为参数

imgOut = Image.fromarray(cubemap)
# imgOut.save('E:\\新联国际\\地产项目\\python_jb\\Bath3.jpg'.split('.')[0]+"_out.png")
imgOut.show()
View Code

 

图片裁剪:

infile = 'E:\\新联国际\\地产项目\\python_jb\\Bath3.jpg'
filename, original_extension = os.path.splitext(infile)
file_extension = ".png"

#  
name_map = [ \
     ["", "", "posy", ""],
     ["negz", "negx", "posz", "posx"],
     ["", "", "negy", ""]]

try:
    im = imgOut
    print(infile, im.format, "%dx%d" % im.size, im.mode)

    width, height = im.size

    cube_size = width / 4

    filelist = []
    for row in range(3):
        for col in range(4):
            if name_map[row][col] != "":
                sx = cube_size * col
                sy = cube_size * row
                fn = name_map[row][col] + file_extension
                filelist.append(fn)
                print("%s --> %s" % (str((sx, sy, sx + cube_size, sy + cube_size)), fn))
                im.crop((sx, sy, sx + cube_size, sy + cube_size)).save(fn) 

    zfname = filename + '.zip'
    print("Creating zipfile: " + zfname)
    zf = zipfile.ZipFile(zfname, mode='w')
    try:
        for fn in filelist:
            zf.write(fn)
        print("done")
    finally:
        zf.close()

except IOError:
    pass
View Code

 

 

这都是在上面的那个论坛上面别人写的,我复制的。

我这边的话,会直接存为单个文件,所以就不用重新在裁剪一次了。

速度的话,还算客可观、毕竟一张图片的大小决定了计算的效率。

 

标签:map,idx,裁剪,face,vals,全景图,numpy,python3,size
From: https://www.cnblogs.com/yc-c/p/14797155.html

相关文章

  • Python3.6以后字典有序且高效
    Python3.6以后字典有序且高效摘自小猿取经:03-06-08-Python3.6以后字典有序且更高效底层分析-小猿取经-林海峰老师-博客园(cnblogs.com)【一】引言在Python3.5(含)以前字典是不能保证顺序的键值对A先插入字典键值对B后插入字典但是当你打印字典的Keys列表时你......
  • 利用Nginx http_image_filter_module模块来裁剪过大的图片
    http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是即时计算的结果,所以网站访问量大的话,不建......
  • Java 调用gdal API(二)——栅格裁剪
    gdal可以说是GIS数据处理比较好的工具之一,虽然也提供了JavaAPI,但是官方文档确实太过简单,用起来确实太难受,每次都需要去参考对应的C++api,然后在对应使用。因此小编决定从这篇文章开始,将自己以前以及今后用到的API,都记录下,以帮助更多从事javaGIS服务开发者。今天主要来记录栅格......
  • 安装Python310和Git
    安装Python3101.下载2.安装安装Git1.下载安装2.汉化GitBash2.汉化GitGUI本文写文时间2023年7月22日,可能在未来会不适合实际情况但是在写文时,不管是跑AI模型还是编译V8引擎,Python310都是稳定可用的安装Python3101.下载访问Python的下载页https://www.python.......
  • win10+python3.8+Anaconda3+cuda10.2+cudnn7.6+pytorch安装教程
    版本问题很重要,为了这个版本,真的吐血版!!!其他链接1.cuda10.2+cudnn7.6安装和测试的方法2.彻底卸载Anaconda3.新建的虚拟环境总是在c盘怎么解决1.安装Anaconda3在Anaconda安装的过程中,比较容易出错的环节是环境变量的配置,所以大家在配置环境变量的时候,要细心一些①安装......
  • Linux下编译安装python3.7 附带python-dev
    1、安装开发工具包sudoyum-ygroupinstall"Developmenttools" 2、安装依赖包sudoyum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-devellibffi-devel ......
  • Python3 pyautogui安装成功,但是不能引用
    安装使用的是pycharm,python3.8python-mpipinstallpyautogui-ihttps://pypi.tuna.tsinghua.edu.cn/simple,显示Successfully。 引用importpyautogui报错:Nomodulenamed'pyautogui'解决办法尝试各种网上的方法,查询环境等,不太懂,感觉没有问题偶然发现虽然piplist有......
  • python3字典添加键值对
    如何在Python3中添加字典键值对概述在Python中,字典(Dictionary)是一种非常有用的数据结构,它可以存储键值对。如果你刚入行并且不知道如何在Python3中添加字典键值对,不用担心!本文将指导你完成这个任务。步骤概览下面是完成这个任务的步骤概览:步骤描述1创建一个空字典......
  • python3正则表达式分组替换
    Python3正则表达式分组替换在Python中,使用正则表达式进行字符串处理是一项非常强大和灵活的技术。正则表达式可以用来匹配、查找和替换字符串中的模式。其中,分组替换是一种常用的技术,它允许我们将正则表达式的匹配结果以分组的形式进行替换。本文将介绍如何在Python3中使用正则表......
  • python3在线编译器
    Python3在线编译器实现介绍在本文中,我将向你展示如何使用Python3来实现一个简单的在线编译器。在线编译器允许用户在浏览器中输入Python3代码,并立即执行并查看结果。我们将使用Flask框架来搭建Web应用程序,其中包含一个页面用于输入和显示代码,并使用Python的exec()函......