#转换pfm到png格式
# -*- coding:utf8 -*-
import re
import numpy as np
import os
import cv2
def read_pfm(file):
"""
读取PFM格式的图像
"""
with open(file, "rb") as f:
# 读取头部信息
header = f.readline().rstrip()
color = True if header == b'PF' else False
# 读取尺寸信息
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().rstrip())
if scale < 0: # 如果比例因子为负,则数据为小端字节序
endian = '<'
scale = -scale
else:
endian = '>' # 大端字节序
# 读取图像数据
data = np.fromfile(f, endian + 'f') # 根据头部信息读取浮点数
shape = (height, width, 3) if color else (height, width)
data = np.reshape(data, shape)
data = np.flipud(data) # PFM格式存储的图像通常是上下颠倒的
return data
def convert_pfm_to_png(pfm_dir, output_dir):
# 检查输出目录是否存在,如果不存在则创建
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 遍历PFM文件目录
for file_name in os.listdir(pfm_dir):
if file_name.endswith('.pfm'):
pfm_path = os.path.join(pfm_dir, file_name)
image_data = read_pfm(pfm_path)
# 构建输出文件名和路径
output_file_name = os.path.splitext(file_name)[0] + '.png'
output_path = os.path.join(output_dir, output_file_name)
# 将numpy数组转换为OpenCV图像并保存
# 注意:image_data需要是符合OpenCV格式的图像数据(通常是uint8类型)
# 如果不是,则需要进行转换
cv2.imwrite(output_path, image_data)
print(f'Converted {pfm_path} to {output_path}')
# 设置PFM文件目录和输出目录
pfm_directory = r'input your path'
output_directory = r'output png path'
# 调用函数进行转换
convert_pfm_to_png(pfm_directory, output_directory)
转换ppm和pgm
from PIL import Image
import os
import glob
# 定义转换函数
def convert_images(input_dir, output_dir, input_ext, output_ext):
# 检查输出目录是否存在,如果不存在则创建
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 获取input_dir目录下所有指定格式的文件
files = glob.glob(os.path.join(input_dir, '*.%s' % input_ext))
# 遍历文件列表,逐个转换
for file_path in files:
# 读取图像
img = Image.open(file_path)
# 构建输出文件名
output_file_name = os.path.splitext(os.path.basename(file_path))[0] + '.' + output_ext
output_file_path = os.path.join(output_dir, output_file_name)
# 转换并保存图像
img.convert('RGB').save(output_file_path, format=output_ext, quality=90)
print(f'Converted {file_path} to {output_file_path}')
# 设置输入输出目录和文件格式
input_directory = r'D:/input' # 替换为你的输入目录路径
output_directory = r'D:/output' # 替换为你的输出目录路径
# input_formats = ('ppm', 'pgm') # 需要转换的文件格式
input_formats = ('pgm') #设置需要转换的格式
output_format = 'png' # 输出文件格式
# 调用转换函数
convert_images(input_directory, output_directory, input_formats, output_format)
参考:Python读取PFM格式的图像_python 读取pfm文件-CSDN博客
以及kimi chat