• RAW图像详解及使用Python读取raw格式图像并显示


    一、RAW图像详解

    1.1 什么是raw格式图像?

    RAW在英文中的解释是未处理的、自然状态的,这也就是RAW文件的真谛。RAW图像就是CMOS或者CCD图像感应器将捕捉到
    的光源信号转化为数字信号的原始数据,因此RAW文件也被人们称之为“数码底片”。RAW格式的全称是RAW Image Format,记
    录了由相机拍摄所产生的一些元数据,如ISO的设置、快门速度、光圈值、白平衡等信息。

    1.2 RAW格式与JPG格式有什么差别?

    如果一句话概括,那就是JPG格式实际上就是由RAW格式处理而来的。RAW格式记录的是拍摄现场的原始数据,然后经过相机自身进行白平衡、锐化、饱和度、色彩等等处理之后,再进行封装,就成为了JPG格式的照片。

    在这里插入图片描述

    1.3 那么RAW和JPG格式到底有什么比较大的区别呢?

    实际上,JPG格式所显示的是照片,也可以说是最终的成片,而RAW是从影像传感器中得到的最原始的信息数据包,而非图像。

    RAW我们通常用色彩深度来表示,色彩深度的单位是bit,一般的JPG照片色彩深度为8bit,这意味着RGB这三种颜色,每个颜色有256个等级,组合起来可以产生总共256256256即约1677万种不同的颜色。

    关于位深可以参考我的另一篇博客:8位, 16位,24位,32位图片显示原理及对比、读自己的mask、判断是否为灰度图

    一般的RAW格式照片,目前的主流水平是12bit和14bit,比如一些全画幅机身能够达到14bit的水准。另外一些高端的中画幅相机能够支持16bit RAW格式文件。色彩深度高了,携带的信息也就更加丰富,但是体积也就增加了,不过这个数值仍然是越大越好。

    二、使用Python读取raw格式图像并显示

    首先确定我们的raw图像是多少位的,我们的是16bit

    实现只需两个基本库,能够实现16位图片的无损转换,转换裁切保存之后的图片位深依然为16bit,方便以后处理。

    • 一律使用np.fromfile读取之后再转化为.png或者.tff格式,读取的时候直接传入文件路径,不用加'r'

    2.1 输出为png图像显示

    import os.path
    import os
    from PIL import Image
    import numpy as np
    import cv2
    import imageio
    
    def read(input_dir, shape, save_dir):
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        # img = cv2.imread('D:\Installer\\h_1_3_00_2_4_0_0_5_30_01_0_00.raw')
    
        # type = img.dtype
        w, h, c = shape
        input_dir = os.path.join('D:\\JS17\rawData\\', input_dir)
        list = os.listdir(input_dir)
        for path in list:
            if path.endswith('.xml'):
                continue
            ### 直接传入文件路径,不用加'r'
            imgData = np.fromfile(input_dir + '\\' + path, dtype='uint16')   ### 这里是16bit所以要uint16
            w, h, c = 5120, 4096, 1
            # # imgData = np.fromfile(r'D:\Installer\\h_1_1_0_2_0_4_1_5_38_63_0.raw', dtype='uint16')   # SAR
            # # w, h, c = 2048, 2048, 1
            imgData = imgData.reshape(w, h, c)
            cv2.imwrite(save_dir + path.split('.')[0] + '.png', imgData)
    if __name__ == '__main__':
    	#### 传入raw文件夹;图像的w, h, c;图像的保存路径
        read('SAR', [2048, 2048, 1], 'D:\\JS17\TIFData\SAR\\')
        read('中波红外', [1024, 1280, 1], 'D:\\JS17\TIFData\MiddleHW\\')
        read('可见光', [4096,5120, 1], 'D:\\JS17\TIFData\KJG\\')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2.2 输出为tif图像显示

    import imageio
    import numpy as np
     
    raw=np.memmap('140-200-1000(2).raw',dtype=np.uint16,shape=(4288,3524))#读取16位raw图片
    imageio.imsave('raw.tif',raw)#转换格式与保存
    
    ### 上面两行其实就已经读取并且转换完成了,已经可以显示了
    ### 下面是做裁剪的,仅供参考
    tif=np.memmap('raw.tif',dtype=np.uint16,shape=(4288,3524))#读取16位tif图片
    resize=tif[1200:1700,1200:1700]
    imageio.imsave('resize.tif',resize)#对16位tif图片裁切
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参考:关于RAW格式照片 你不可不知的十件事
    使用Python读取raw格式图像并显示
    [史上最全]16bit RAW图片读取、转换、裁切、保存

  • 相关阅读:
    【微机原理笔记】第 6 章 - 输入输出和中断技术
    async-validator 源码学习(一):文档翻译
    新增用户登录和资产登录通知功能,支持指定目录运行作业中心命令,JumpServer堡垒机v3.8.0发布
    第六章 图 九、拓扑排序
    vue3 传值
    bash例子-source进程替换、alias不生效处理
    线程安全问题
    工业异常检测:从前沿到落地
    VMware启用共享文件夹
    Javaweb作业小结
  • 原文地址:https://blog.csdn.net/m0_46378271/article/details/126090531