Python raw格式图像转png格式

raw数据的读取有rawpy,numpy和逐元素读取等方法,一般在raw数据上进行深度学习神经网络的研究需要先将raw转换成数组方式才能输入到模型中进行训练。先介绍两种读取raw数据为数组并将之转为png图片的方法:

1、使用rawpy来读取raw数据

注意raw数据有很多种不同后缀名,如:.raw、.dng、.arw等。raw数据直接来源于sensor,不同公司的sensor是不一样的,他们的数据后缀名也就不一样了。下面以.dng为例,其他也一样的:

import numpy as np
import imageio
import rawpy
import sys
import os
import cv2

def extract_bayer_channels(raw):

    ch_B  = raw[1::2, 1::2]
    ch_Gb = raw[0::2, 1::2]
    ch_R  = raw[0::2, 0::2]
    ch_Gr = raw[1::2, 0::2]

    return ch_R, ch_Gr, ch_B, ch_Gb


if __name__ == "__main__":

    raw_file = "raw.dng"
    print("Converting file " + raw_file)

    if not os.path.isfile(raw_file):
        print("The file doesn't exist!")
        sys.exit()
    
    raw = rawpy.imread(raw_file)
    raw_image = raw.raw_image
    del raw
	
	"""# extract_bayer_channels将raw数据按4通道提取,至于为何是4通道这里就不介绍了
    raw_image = raw_image.astype(np.float32)
    print(np.max(raw_image))
    ch_R, ch_Gr, ch_B, ch_Gb = extract_bayer_channels(raw_image)
    # 拼合四通道一起
    out = np.stack((R, Gr, Gb, B))"""
	
	# raw数据一般是16位,有效位可能为16,14,12,10等。常见位12位
    png_image = raw_image.astype(np.uint16)
    new_name = raw_file.replace(".dng", ".png")
    imageio.imwrite(new_name, png_image)

numpy读取raw数据的方式是:numpy.fromfile('a.raw')

2、以二进制读raw数据然后逐元素取值

一般raw数据是12位有效的,不管是rawpy,还是numpy。它们读取raw数据都是将16位全部读进来,默认低四位位无效位且全部为0,可是这样会增大像素值的范围。有效位12位的话,那么像素值范围应该是0~4095,而不丢弃无效的4个0的话,像素值的范围就会变成0-65535了。以二进制读取则可以避免:

# -*- coding:utf8 -*-

import numpy as np
import cv2
import os
import imageio

def oneimg2png(root_dir, out_path):
    filelist = os.listdir(root_dir)
    
    # filelist.sort(key=lambda x: int(x.split('_')[5]))
    
    for file in filelist:
    	# shape为raw数据的分辨率乘积
        bayer = np.zeros(shape=2073600, dtype='uint16')
        file_path = os.path.join(root_dir, file)
        with open(file_path, "rb") as f:
            for i in range(0, len(f.read()), 2):
                f.seek(i)
                raw = f.read(2)
                a1 = int((raw[0] / 16) % 16)
                a2 = int(raw[0] % 16)
                a3 = int((raw[1] / 16) % 16)
                a4 = int(raw[1] % 16)
                # 两个字节对应一个像素点,我的数据有效位为12位,高低位顺序为a3 a4 a1 a2,
                # a2位低四位且是无效位全为0,所以抛掉不用
                value = a3 * 256 + a4 * 16 + a1 * 1
                # bayer[int(i / 2)] = value / 4096 * 1024
                bayer[int(i / 2)] = value

        bayer = bayer.reshape(1080, 1920)
        print("bayer max:{} bayer min:{}".format(np.max(bayer), np.min(bayer)))
        new_name = file_path.replace(".raw", ".png")

        new_name = os.path.basename(new_name)
        imageio.imwrite(out_path + '/' + new_name, bayer)

        f.close()

    print("raw finished")

if __name__ == '__main__':
    _ = oneimg2png(root_dir='放有raw数据的文件夹路径', out_path='输出png图片的文件夹路径')
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 当然可以,权限管理系统通常会包含以下几个部分: 1. 用户:表示系统中的每一个人员,通常会有一个用户名和密码来标识唯一的用户。 2. 角色:表示用户的身份和权限,比如管理员、普通用户等。 3. 资源:表示系统中可以被访问的资源,比如文件、数据库表格等。 4. 权限:表示用户对资源的操作权限,比如读取、修改、删除等。 用 UML 画出来可能长这样: [用 ### 回答2: 当处理图像数据时,Python的PIL库是一个非常有用的工具。下面是用Python编写的将raw格式图像换为RGB图像的一个简单代码示例: ```python from PIL import Image def raw_to_rgb(raw_file, width, height): # 根据raw图像的宽度和高度创建一张新的RGB图像 rgb_image = Image.new('RGB', (width, height)) pixel_data = [] # 打开raw图像文件并逐个读取像素值 with open(raw_file, 'rb') as file: byte = file.read(3) # 从文件中读取3个字节(一个像素的RGB值) while byte: # 将读取的字节换为RGB元组,并将该元组添加到pixel_data列表中 pixel = tuple(byte) pixel_data.append(pixel) byte = file.read(3) # 继续读取下一个像素的RGB值 # 将像素数据填充到RGB图像中 rgb_image.putdata(pixel_data) # 保存换后的RGB图像 rgb_image.save('converted_rgb_image.jpg') # 输入 raw_file = 'path/to/raw_file.raw' # 替换为raw图像文件的路径 width = 640 # 替换为raw图像的宽度 height = 480 # 替换为raw图像的高度 # 调用函数进行raw_to_rgb(raw_file, width, height) ``` 请注意,上述代码需要将`path/to/raw_file.raw`替换为实际的raw图像文件路径,并根据raw图像的宽度和高度更新`width`和`height`值。换后的RGB图像将保存在当前工作目录下,并命名为`converted_rgb_image.jpg`(可以根据需要修改保存的文件格式和文件名)。 ### 回答3: 以下是一个将raw格式图像换为rgb图像Python代码示例: ```python import numpy as np import cv2 def convert_raw_to_rgb(raw_image_path, width, height): # 读取raw格式图像数据 raw_data = np.fromfile(raw_image_path, dtype=np.uint8) # 计算图像总像素数 num_pixels = width * height # 将raw数据分成R、G、B三个通道 r_channel = raw_data[0:num_pixels].reshape(height, width) g_channel = raw_data[num_pixels:num_pixels*2].reshape(height, width) b_channel = raw_data[num_pixels*2:].reshape(height, width) # 合并R、G、B通道为RGB图像 rgb_image = cv2.merge((r_channel, g_channel, b_channel)) # 显示并保存RGB图像 cv2.imshow('RGB Image', rgb_image) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imwrite('output_rgb.png', rgb_image) # 调用函数进行图像换 convert_raw_to_rgb('input.raw', 640, 480) ``` 在以上代码中,使用了NumPy库来处理图像数据,以及OpenCV库来显示和保存RGB图像。代码首先读取raw格式图像数据,并将其分割成R、G、B三个通道。然后,使用OpenCV的merge函数将三个通道合并为RGB图像,并显示出来。最后,将RGB图像保存为output_rgb.png文件。根据你的具体需求,可以修改代码中的raw_image_path、width和height参数值来适应不同的raw图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值