Python 读写 RAW 格式图像

本文最后更新于:2022年11月15日 上午

RAW 格式是相机产生的原始图像格式,带有丰富的图像信息,但其本身并不是常用的图像格式,本文记录 Python 下 RAW 图像的读写方法。

RAW 图像

  • RAW的原意就是“未经加工”。可以理解为:RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。RAW格式的全称是RAW Image Format,在编程中称之为原始。

    —— 百度百科

优势

  • RAW文件几乎是未经过处理而直接从CCD或CMOS上得到的信息,通过后期处理,摄影师能够最大限度地发挥自己的艺术才华。
  • RAW文件并没有白平衡设置,但是真实的数据也没有被改变,就是说作者可以任意的调整色温和白平衡,并且是不会有图像质量损失的。
  • 颜色线性化和滤波器行列变换在具有微处理器的电脑上处理得更加迅速,这允许应用一些相机上所不允许采用的、较为复杂的运算法则。
  • 虽然RAW文件附有饱和度、对比度等标记信息,但是其真实的图像数据并没有改变。用户可以自由地对某一张图片进行个性化的调整,而不必基于一、两种预先设定好的模式。
  • 也许RAW最大的优点就是可以将其转化为16位的图像。也就是有65536个层次可以被调整,这对于JPG文件来说是一个很大的优势。

RAW格式扩展名

不同的相机产生的RAW文件的扩展名一般不同,下表列举出常见相机厂商生产的相机的RAW文件的扩展名:

品牌 扩展名
富士 *.raf
佳能 .crw,.cr2,*.cr3
柯达 *.kdc
美能达 *.mrw
尼康 *.nef
奥林巴斯 *.orf
adobe *.dng
宾得 .ptx,.pef
索尼 *.arw
适马 *.x3f
松下 *.rw2

Python 读写 RAW 图像

  • 对于读取图像的程序来说,RAW 图像就是一堆像素点堆成的数据包,读进来就是一堆点信息
  • Python 可以通过自带的 numpy 包解析 RAW 图像数据,过程中需要预先获取图像尺寸和位深度

读取 RAW 图像

  • 使用 numpy 包的 fromfile 函数读取文件,过程中输入数据类型
1
2
3
4
5
6
7
import numpy as np

file_path = 'origin.raw'
# 16 位 raw 数据
data = np.fromfile(file_path, dtype=np.uint16)
# 8 位 raw 数据
data = np.fromfile(file_path, dtype=np.uint8)
  • 此时读取到的数据为一堆数据而已,并不是图像

  • 需要给定数据形状,才能按照要求组织成原始的图像
1
img = np.reshape(data, newshape=[3072, 4096, 1])

  • 之后就可以当成正常图像使用了
  • 过程中可以在 uint8 和 uint16 等数据格式间转换
1
2
data.astype(np.uint8)
data.astype(np.uint16)

写入 RAW 图像

  • 写入图像就是将数据直接写到磁盘
1
2
save_path = 'output.raw'
img.tofile(save_path)

参考资料


Python 读写 RAW 格式图像
https://www.zywvvd.com/notes/study/image-processing/raw-img-rw/raw-img-rw/
作者
Yiwei Zhang
发布于
2022年11月15日
许可协议