分层存储的图片的3d显示

news2025/3/19 8:27:47

分层存储的图片叠层成为3d,并显示。

文件夹D:\mask内的分层存储的图像文件mask_1.PNG至mask_12.PNG:

1、显示为3d点云:

import open3d as o3d
import numpy as np
from PIL import Image


def images2point_cloud(paths, layer_height):
    points = []

    for i, image_path in enumerate(paths):     # 分层读取
        img = Image.open(image_path)
        img_array = np.array(img)

        img_height, img_width = img_array.shape

        for y in range(img_height):    
            for x in range(img_width):
                if img_array[y][x] > 0:  # 假设非黑色点为感兴趣的点
                    points.append([x, y, i * layer_height])  # 将 2D 像素点转换为 3D 点,高度使用索引值

    return points

# 替换为你实际存储图像的路径
image_paths = ['D:\\mask\\mask_1.PNG', 'D:\\mask\\mask_2.PNG', 'D:\\mask\\mask_3.PNG', 'D:\\mask\\mask_4.PNG', 'D:\\mask\\mask_5.PNG', 'D:\\mask\\mask_6.PNG', 'D:\\mask\\mask_7.PNG', 'D:\\mask\\mask_8.PNG', 'D:\\mask\\mask_9.PNG', 'D:\\mask\\mask_10.PNG', 'D:\\mask\\mask_11.PNG', 'D:\\mask\\mask_12.PNG']

# 定义层间距离
height = 5.0

points = images2point_cloud(image_paths, height)
point_cloud = o3d.geometry.PointCloud()

point_cloud.points = o3d.utility.Vector3dVector(points)
o3d.visualization.draw_geometries([point_cloud])

 输出:

 

进一步,可以自定义云点的颜色:

import open3d as o3d
import numpy as np
from PIL import Image

def images2point_cloud(paths, layer_height):
    points = []
    colors = []

    for i, image_path in enumerate(paths):     # 分层读取
        img = Image.open(image_path)
        img_array = np.array(img)

        img_height, img_width = img_array.shape

        for y in range(img_height):
            for x in range(img_width):
                if img_array[y][x] > 0:  # 假设非黑色点为感兴趣的点
                    points.append([x, y, i * layer_height])  # 将 2D 像素点转换为 3D 点,高度使用索引值
                    colors.append([1, 0, 0])  # 设置颜色为红色

    return points, colors

# 替换为你实际存储图像的路径
image_paths = ['D:\\mask\\mask_1.PNG', 'D:\\mask\\mask_2.PNG', 'D:\\mask\\mask_3.PNG', 'D:\\mask\\mask_4.PNG', 'D:\\mask\\mask_5.PNG', 'D:\\mask\\mask_6.PNG', 'D:\\mask\\mask_7.PNG', 'D:\\mask\\mask_8.PNG', 'D:\\mask\\mask_9.PNG', 'D:\\mask\\mask_10.PNG', 'D:\\mask\\mask_11.PNG', 'D:\\mask\\mask_12.PNG']

# 定义层间距离
height = 5.0

points, colors = images2point_cloud(image_paths, height)
point_cloud = o3d.geometry.PointCloud()

point_cloud.points = o3d.utility.Vector3dVector(points)
point_cloud.colors = o3d.utility.Vector3dVector(colors)

# 显示渲染后的 3D 实体
o3d.visualization.draw_geometries([point_cloud])

 

 2、将点云渲染为体素网格

import open3d as o3d
import numpy as np
from PIL import Image


def images2point_cloud(paths, layer_height):
    points = []

    for i, image_path in enumerate(paths):     # 分层读取
        img = Image.open(image_path)
        img_array = np.array(img)

        img_height, img_width = img_array.shape

        for y in range(img_height):    
            for x in range(img_width):
                if img_array[y][x] > 0:  # 假设非黑色点为感兴趣的点
                    points.append([x, y, i * layer_height])  # 将 2D 像素点转换为 3D 点,高度使用索引值

    return points

# 替换为你实际存储图像的路径
image_paths = ['D:\\mask\\mask_1.PNG', 'D:\\mask\\mask_2.PNG', 'D:\\mask\\mask_3.PNG', 'D:\\mask\\mask_4.PNG', 'D:\\mask\\mask_5.PNG', 'D:\\mask\\mask_6.PNG', 'D:\\mask\\mask_7.PNG', 'D:\\mask\\mask_8.PNG', 'D:\\mask\\mask_9.PNG', 'D:\\mask\\mask_10.PNG', 'D:\\mask\\mask_11.PNG', 'D:\\mask\\mask_12.PNG']

# 定义层间距离
height = 5.0

points = images2point_cloud(image_paths, height)
point_cloud = o3d.geometry.PointCloud()

point_cloud.points = o3d.utility.Vector3dVector(points)

# 创建点云体素网格
voxel_size = 1
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(point_cloud, voxel_size=voxel_size)

# 显示体素网格,指定渲染模式为网格
o3d.visualization.draw_geometries([voxel_grid], mesh_show_wireframe=True)


 3、使用vtk库显示3d实体

参照博文:【Python VTK】读取二维序列医学图像分割结果并进行三维重建_vtk三维重建-CSDN博客

 

import vtk

# 创建渲染器、窗口和交互器
renderer = vtk.vtkRenderer()
window = vtk.vtkRenderWindow()
window.AddRenderer(renderer)
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)

# 图像读取
reader = vtk.vtkPNGReader()
reader.SetDataExtent(0, 300, 0, 300, 0, 12) # 定义图像大小和层数
name_prefix = 'D:/mask/mask_'   # 设置图像前缀名字
reader.SetFilePrefix(name_prefix)
reader.SetFilePattern("%s%d.PNG")
reader.Update()

reader.SetDataByteOrderToLittleEndian()
spacing = [1.0, 1.0, 5.0]  # x, y 方向上的间距为 1 像素,层间距距为 5 像素
reader.GetOutput().SetSpacing(spacing)


# 高斯平滑
gauss = vtk.vtkImageGaussianSmooth()
gauss.SetInputConnection(reader.GetOutputPort())
gauss.SetStandardDeviations(1.0, 1.0, 1.0)
gauss.SetRadiusFactors(1.0, 1.0, 1.0)
gauss.Update()

# 计算轮廓
contour = vtk.vtkMarchingCubes()
gauss.GetOutput().SetSpacing(spacing)
contour.SetInputConnection(gauss.GetOutputPort())
contour.ComputeNormalsOn()
contour.SetValue(0, 100)

# 映射器和演员
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
mapper.ScalarVisibilityOff()

actor = vtk.vtkActor()
actor.SetMapper(mapper)

# 设置渲染器背景颜色
renderer.SetBackground([0.0, 0.0, 0.0])
renderer.AddActor(actor)

# 开始显示
if __name__ == '__main__':
    window.Render()
    interactor.Initialize()
    interactor.Start()

 显示效果:

​​​​​​​

 持续寻找新的方法中。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1789434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue中实现一个时间选择器的级联框,第一层小时,第二层分钟

最近在做一个考勤系统时&#xff0c;新增班次的时候需要设置打卡时段&#xff0c;类似如下效果&#xff1a; 1、封装自定义组件Time.vue 接收参数有endHour(范围结束的小时数)、endMinute(最后一小时结束的分钟数)等&#xff0c;根据具体需求变动 <template><div&…

一天涨粉1000+,月变现至少1w+的AI副业项目。

大家好&#xff0c;我是设计师阿威 今天我要揭秘一个一天涨粉1000&#xff0c;月变现至少1w的AI副业项目。 视频制作超级简单&#xff0c;却几乎条条爆款&#xff0c;看下图 这个作品玩法的原理就是&#xff0c;让Ai绘图软件&#xff0c;生成自己理解的某个事物或者东西是什么…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十六)- 微服务(6)

目录 10. Docker 10.1 Docker基本操作 10.1.1 镜像相关命令 10.1.2 容器相关命令 10.2 数据卷命令 10.2.1 常用命令 : 10.2.2 挂载数据卷 10. Docker 10.1 Docker基本操作 10.1.1 镜像相关命令 docker --help 查看docker帮助文档 docker images --help 查看docker ima…

石油行业的数字化转型与智能化发展:新技术综合运用助力业务提升

引言 石油行业面临的挑战与机遇 石油行业是全球能源供应的重要支柱&#xff0c;然而&#xff0c;随着资源枯竭、环境压力增加以及市场竞争加剧&#xff0c;石油企业面临着前所未有的挑战。传统的勘探和生产方式已经难以满足当前高效、安全、环保的要求。同时&#xff0c;能源转…

Codeforces Round 948 (Div. 2) A~D

A. Little Nikita &#xff08;思维&#xff09; 题意&#xff1a; 小 A A A决定用一些立方体建一座塔。一开始&#xff0c;塔上没有任何立方体。在一次移动中&#xff0c;小 A A A要么正好把 1 1 1 个立方体放到塔顶&#xff0c;要么正好从塔顶移走 1 1 1 个立方体。存不存…

适合能源企业的文档安全外发系统应该是什么样的?

能源企业是市场经济中的重要组成&#xff0c;也是社会可持续长远发展的关键组成之一&#xff0c;能源行业在开拓新能源业务线、提升产能的日常经营中&#xff0c;也需要与外部合作伙伴、客户间进行密切的业务往来&#xff0c;文档可能涉及多个领域多个类型。 能源供应合同&…

车载测试常用工具简介

什么是车载测试 车载测试是对车辆的智能模块进行的测试工作&#xff0c;是道路测试的一部分。车载测试包括功能测试、性能测试&#xff0c;安全测试等。测试方法有软件测试和硬件测试。目前来说新能源汽车所说的车载测试主要指的是汽车软件的功能测试&#xff0c;也就是针对汽…

企业微信hook接口协议,ipad协议http,发送朋友圈评论

发送朋友圈评论 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"1688857826547606","ref_commentid":0, //评论id 默认传0 如果需要回复别人的评论则传别人评论的id 从获取朋友圈…

Java文件操作①——XML文件的读取

系列文章目录 文章目录 系列文章目录前言一、邂逅XML二、应用 DOM 方式解析 XML三、应用 SAX 方式解析 XML四、应用 DOM4J 及 JDOM 方式解析 XMLJDOM 方式解析 XMLDOM4J 方式解析 XML前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

Python | 试卷刷题and基础笔记

1.下列转义字符中&#xff0c; 属于“回车”含义的是 \n 换行 \r 回车 2.for循环遍历字典 在Python中&#xff0c;你可以使用for循环来遍历字典的键&#xff08;keys&#xff09;、值&#xff08;values&#xff09;或者键-值对&#xff08;items&#xff09;。下面是三种遍历…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

数据库迁移的神秘面纱:Liquibase异常全解析与解决之道

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Liquibase简介与重要性 Liquibase&#xff0c;这个名字听起来就像是液体的魔法。在软件开发的世界里&#xff0c;它确实是一种魔法&#xff0c;一种让数据库变更变得清晰、可控甚至可逆的魔法。但就像所有魔法一…

算法基础之哈希表

大家好&#xff0c;这里是教授.F 什么是哈希表&#xff1a; 哈希表其实就是数组的pro版本。数组有下标&#xff0c;每个下标对应着一个值。哈希表也类似&#xff0c;哈希表有很多哈希值&#xff0c;然后每一个哈希值都会对应着一个值。就是这样&#xff1a;hash(key) 哈希表的…

视频号视频提取器有那些?免费版可以下载视频号视频吗?

在网络上&#xff0c;确实存在多种工具和公众号用于下载视频号内容。今天就说说免费的视频提取器有那些&#xff1f; 视频号提取器工具中常见的有公众号和软件。这些工具通常可以帮助用户从微信视频号平台下载视频内容。 但请注意&#xff0c;使用这些工具可能需要考虑版权和法…

【记录】打印|用浏览器生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候&#xff0c;我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下&#xff0c;用 PDF 打印应该也可以直接打印出来&#xff0c;然后就琢磨出来了&#xff0c;这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…

南卡、韶音、Cleer、漫步者开放式耳机好用吗?最强开放式耳机对比揭秘!

在挑选开放式耳机时&#xff0c;个人经验和实际需求应当优先考虑&#xff0c;而非盲目追随潮流或品牌效应。投资耳机前务必慎重&#xff0c;毕竟高价值商品若无法退换&#xff0c;难免造成遗憾。为了帮助大家做出更加明智的决策&#xff0c;我亲自出资购买并测试了市面上多款主…

【Java】Hutool发送邮件功能

目录 开通qq邮箱的stmp实战pom.xmlapplication.ymlcontrollerservice实体类辅助类 需要实现一个通过邮箱找回密码的功能 正常来说&#xff0c;找回密码的验证码&#xff0c;一般来说&#xff0c;都是通过手机号来找回的居多&#xff0c;那为什么会有通过邮箱找回的方式该说不说…

壁纸取图小程序源码系统 可植入广告 低成本搭建 带完整的安装代码包以及搭建教程

系统概述 本壁纸取图小程序源码系统是一套基于微信小程序框架的完整解决方案&#xff0c;旨在为开发者提供一套高效、稳定、易用的壁纸资源管理与分发平台。系统采用模块化设计&#xff0c;具有良好的扩展性和可维护性&#xff0c;同时支持多种广告形式&#xff0c;为开发者提…

“JS逆向 | Python爬虫 | 动态cookie如何破~”

案例目标 目标网址:aHR0cHMlM0EvL21hdGNoLnl1YW5yZW54dWUuY29tL21hdGNoLzI= 本题目标:提取全部 5 页发布日热度的值,计算所有值的加和,并提交答案 常规 JavaScript 逆向思路 JavaScript 逆向工程通常分为以下三步: 寻找入口:逆向工程的核心在于找出加密参数的生成方式。…

【设计模式】结构型-组合模式

前言 在软件开发中&#xff0c;设计模式是一种被广泛应用的解决问题的方法论。其中&#xff0c;结构性设计模式是一类特别重要的模式&#xff0c;它们用于处理类或对象之间的组合关系&#xff0c;其中之一就是组合模式。组合模式允许客户端统一对待单个对象和对象的组合&#…