You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将16位3通道PNG深度图像转换为指定尺寸PFM格式

解决方案:16位3通道PNG深度图转指定尺寸PFM格式

问题核心

  • 需将16位3通道、640×480的PNG深度图转换为960×540的PFM格式
  • OpenCV直接保存PFM出现空值,本质是OpenCV对PFM格式要求严格:PFM需单通道浮点型数据,而你的输入是多通道整数格式,不符合规范

分步处理与代码实现

1. 读取PNG深度图(保留16位原始数据)

使用OpenCV的IMREAD_UNCHANGED参数读取,避免自动将16位数据压缩为8位:

import cv2
import numpy as np

# 读取原始PNG深度图
png_depth = cv2.imread("T7WEL.png", cv2.IMREAD_UNCHANGED)
# 验证数据:形状应为(480, 640, 3),数据类型uint16
print(png_depth.shape, png_depth.dtype)

2. 合并多通道为单通道

从你的数值截图可见,3通道像素值完全一致,提取任意一个通道即可得到单通道深度图:

# 提取第一个通道(或第二、第三通道,结果一致)
single_channel_depth = png_depth[:, :, 0]

3. 调整图像尺寸到960×540

深度图建议用最近邻插值(避免深度值被模糊),若需要平滑效果也可使用线性插值:

target_size = (960, 540)
resized_depth = cv2.resize(single_channel_depth, target_size, interpolation=cv2.INTER_NEAREST)

4. 转换为PFM要求的浮点格式

PFM默认存储32位浮点数据,需将16位整数转换为浮点型。若原始深度值单位是毫米,可按需转换为米(无单位转换需求则直接转浮点即可):

# 转换为float32,示例:毫米转米
pfm_data = resized_depth.astype(np.float32) / 1000.0

5. 正确保存为PFM格式

OpenCV的imwrite对PFM支持有限,推荐两种可靠方案:

方案一:自定义PFM写入函数
def write_pfm(file_path, data, scale=1.0):
    """保存单通道浮点数据为PFM格式"""
    with open(file_path, 'wb') as f:
        # 写入PFM头部:灰度格式标识、尺寸、小端字节序标记(负缩放因子)
        height, width = data.shape
        f.write(b'Pf\n')
        f.write(f'{width} {height}\n'.encode())
        f.write(f'{-scale}\n'.encode())
        # PFM要求从底部行开始存储,需翻转数据
        data = np.flipud(data)
        # 写入二进制数据
        data.tofile(f)

# 保存结果
write_pfm("output.pfm", pfm_data)
方案二:使用imageio库(更简便)

先安装依赖:

pip install imageio

然后直接保存:

import imageio

imageio.imwrite("output.pfm", pfm_data)

关键注意事项

  • 若你的深度图通道值不一致,需确认深度值存储的目标通道(通常为红色通道)后再提取
  • PFM的缩放因子需根据深度单位调整,自定义函数中scale参数对应深度值的缩放比例
  • 保存前务必确保数据为单通道浮点型,这是解决OpenCV保存PFM为空的核心前提

内容的提问来源于stack exchange,提问作者lashari0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:10:19