pfm格式转png格式

PFM是一种用浮点数存储图片的文件格式,包含文件信息header和二进制数据raster。在一些数据集中经常可以看到以pfm格式存储的视差图。pfm格式的文件不利于浏览,可以转成png格式文件已方便浏览。

PFM的头文件共有3行:

二进制数据区:

图像的读取顺序按照从下到上,从左到右进行的顺序进行读取。

当pfm文件只有一张图片的矩阵时,代码如下:

# -*- coding: UTF-8 -*-
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import os
import re
import cv2

def pfm_png_file_name(pfm_file_path,png_file_path):
    png_file_path={}
    for root,dirs,files in os.walk(pfm_file_path):
        for file in files:
            file = os.path.splitext(file)[0] + ".png"
            files = os.path.splitext(file)[0] + ".pfm"
            png_file_path = os.path.join(root,file)
            pfm_file_path = os.path.join(root,files)
            pfm_png(pfm_file_path,png_file_path)

def pfm_png(pfm_file_path,png_file_path):
    with open(pfm_file_path, 'rb') as pfm_file:
        header = pfm_file.readline().decode().rstrip()
        channel = 3 if header == 'PF' else 1

        dim_match = re.match(r'^(\d+)\s(\d+)\s$', pfm_file.readline().decode('utf-8'))
        if dim_match:
            width, height = map(int, dim_match.groups())
        else:
            raise Exception("Malformed PFM header.")

        scale = float(pfm_file.readline().decode().strip())
        if scale < 0:
            endian = '<'    #little endlian
            scale = -scale
        else:
            endian = '>'    #big endlian

        disparity = np.fromfile(pfm_file, endian + 'f')

        img = np.reshape(disparity, newshape=(height, width))
        img = np.flipud(img)
        plt.imsave(os.path.join(png_file_path), img)

def main():
    pfm_file_dir = '/home/cc/下载/PSMNet-master/dataset/data_scene_flow/training/disp_occ_0'
    png_file_dir = '/home/cc/下载/PSMNet-master/dataset/data_scene_flow/training/disp_occ_1'
    pfm_png_file_name(pfm_file_dir, png_file_dir)
   
if __name__ == '__main__':
    main()

 

参考博客:

https://blog.youkuaiyun.com/weixin_44899143/article/details/89186891                                    PFM格式图像和读取middlebury 数据集

https://blog.youkuaiyun.com/qq_43225437/article/details/86589892                                               python : npy格式转png格式(源码)

### 如何在 Linux 系统中打开 PFM 文件 PFM(Portable Float Map)是一种用于存储浮点数像素值的图像格式,通常由计算机图形学应用生成。为了在 Linux 中查看这些文件的内容,可以采用多种方法。 #### 方法一:使用 ImageMagick 工具包换并显示 ImageMagick 是一个强大的图像处理工具集,在其中包含了对 PFM 格式的支持。安装完成后可以通过 `convert` 或者 `display` 命令来操作 PFM 文件[^2]。 ```bash sudo apt-get install imagemagick convert input.pfm output.png # 将 PFM 换成 PNG 格式以便于预览 display output.png # 使用 display 查看图片 ``` #### 方法二:利用 OpenCV 库编写 Python 脚本读取和展示 OpenCV 提供了对于 PFM 的读写功能,因此可以直接加载 PFM 文件并通过窗口显示出来。这里给出一段简单的 Python 代码作为示范: ```python import cv2 import numpy as np def read_pfm(file_path): with open(file_path, 'rb') as f: color = None width = None height = None scale = None endian = None header = f.readline().rstrip() if header.decode('ascii') == b'PF': color = True elif header.decode('ascii') == b'Pf': color = False else: raise Exception('Not a PFM file.') dim_match = re.match(r'^(\d+)\s+(\d+)\s$', f.readline().decode('ascii')) if dim_match: width, height = map(int, dim_match.groups()) else: raise Exception('Malformed PFM header.') scale = float(f.readline().strip()) if scale < 0: # little-endian endian = '<' scale = -scale else: endian = '>' # big-endian data = np.fromfile(f, endian + 'f') shape = (height, width, 3) if color else (height, width) return np.flipud(np.reshape(data, shape)).astype(np.float32), scale img, _ = read_pfm('/path/to/input.pfm') cv2.imshow('PFM Image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段脚本定义了一个函数 `read_pfm()` 来解析 PFM 文件头信息,并按照指定的方式读入数据矩阵;最后调用 OpenCV 函数显示图像[^4]。 #### 方法三:借助 GIMP 插件导入 GIMP 是一款开源的照片编辑软件,它拥有丰富的插件生态系统。虽然默认情况下不支持 PFM 文件,但是有第三方开发人员提供了相应的插件使得能够方便地导入这种类型的文件进行编辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值