0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈图像调试之raw图像问题分析

新机器视觉 来源:ISP Tuning 2023-11-27 10:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、问题背景

在图像调试过程,当发现一个问题时,很多时候都要通过 dump raw 图像来分析,如果raw图像上有,那就排除了是 ISP的处理导致。

下一步就是排查 sensor 或者镜头,这样可以有效的帮我们定位问题所在。

但遇到过有些 raw, 用工具打不开或者出图不对的情况,那可能是因为 raw 的存储格式不同导致,本文主要对 raw 的格式做下介绍说明。

2、问题分析

a. 什么是 raw

raw 数据是 sensor 输出的原始数据,常用的一般有raw8, raw10, raw12等,分别表示一个像素点有 8bit、10bit、12bit 数据。

是 sensor 将光信号转化为电信号时的电平高低的原始记录,单纯地没有进行任何处理的图像数据,即表现的是 sensor 和镜头本征特性的数据。

raw 数据在输出的时候是有一定顺序的,主要有四种: GRBG、RGGB、BGGR、GBRG,如下图为BGGR格式。

cc6faf98-8c0e-11ee-939d-92fbcf53809c.png

b. raw 分哪几种格式,有什么区别 ?

raw 一般分为 plain raw 和 mipi raw,主要是存储方式上的区别,如下图所示是 Plain raw10 的示意图。

cc80f852-8c0e-11ee-939d-92fbcf53809c.png

10bit的raw,单个像素也就是10bit,需要两个字节(16bit)来存储,那就会空出 6位用不到。

因为有空余,这里就涉及到一个高位/低位对齐的问题,也就是存储数据时,右移6位低位对齐(如上图1所示),左移6位高位对齐(如上图2所示)。

这个主要看平台厂商对数据处理有什么要求,我司用的是高位对齐的数据,所以读取时,要有相应的移位操作才行。

如下图所示是 mipi raw10 的示意图,以大端存储方式为例,它是把4个像素放到5个字节(40bit)中,组成一个包去存储。

cc8d3414-8c0e-11ee-939d-92fbcf53809c.png

前4字节依次存放 raw10 图像的前 4个像素的后 8位,4个像素的前 2位依次存放在包的第 5个字节中。

所以从存储方式来看,mipi raw 的存储方式是要比 plain raw 更节省内存。

c. 怎么正确查看 raw ?

一般raw图工具打开都会要求配置一下 raw 图尺寸、位宽、bayer格式、MSB/LSB。

但一般工具支持 plain raw 打开的居多,还有些并不支持MSB和LSB的选择,所以需要我们对 raw 做一下处理。

如下是mipi raw 转 plain raw 、plain raw10 MSB 转LSB 的相关 python 代码。

分析代码的处理过程,也会加深我们关于raw图像的理解,如下代码中使用的raw图像,可以在公众号后台回复 "raw图" 获取。

# plain raw10 的读取和 MSB转LSB的处理


import numpy as np


def read_plained_file(file_path_name,height,width,shift_bits):
    frame = np.fromfile(file_path_name, dtype="uint16")
    frame=frame[0:height*width]
    frame.shape = [height, width]


    # MSB ----> LSB,  LSB存低位数据,此时是高位对齐的,则右移代表向低位移了6位,数值是减小的状态。
    frame=np.right_shift(frame, shift_bits)  
    return frame


if __name__ == "__main__":
    file_name = "ov13b10_shading_4208X3120_MSB.raw"
    image = read_plained_file(file_name, 3120, 4208, 6)
    image = image / 1023


    # 将读取的 image 数据另存为 raw 数据
    output_file_name = "output_image.raw"


    # 将图像数据映射到 16 位无符号整数范围
    image_mapped = (image * 1023).astype('uint16')
    image_mapped.tofile(output_file_name)
    print(f"Image data has been saved to {output_file_name}")
# mipi raw10 转 plain raw10


import numpy as np
import math


def read_mipi10_file(file_path_name,height,width):
    # 单行长度的补齐
    new_width = int(math.floor((width + 3) / 4) * 4) #对四字节补齐
    packet_num_L = int(new_width / 4)
    width_byte_num = packet_num_L * 5 #单行byte长度
    width_byte_num = int(math.floor((width_byte_num + 7) / 8) * 8)#单行做8个字节补齐
    image_bytes=width_byte_num*height
    frame = np.fromfile(file_path_name, count=image_bytes,dtype ="uint8")
    print("b shape",frame.shape)
    print('%#x'%frame[0])


    frame.shape = [height, width_byte_num] #按字节整理的图像矩阵
    one_byte = frame[:,05]
    two_byte = frame[:,15]
    three_byte = frame[:,25]
    four_byte = frame[:,35]
    five_byte = frame[:,45]


    #数据转换防止溢出
    one_byte = one_byte.astype('uint16')
    two_byte = two_byte.astype('uint16')
    three_byte = three_byte.astype('uint16')
    four_byte = four_byte.astype('uint16')
    five_byte = five_byte.astype('uint16')


    #用矩阵的方法进行像素的拼接
    one_byte = np.left_shift(one_byte, 2) + np.bitwise_and((five_byte), 3)
    two_byte = np.left_shift(two_byte, 2) + np.right_shift(np.bitwise_and((five_byte), 12), 2)
    three_byte = np.left_shift(three_byte, 2) + np.right_shift(np.bitwise_and((five_byte), 48), 4)
    four_byte = np.left_shift(four_byte, 2) + np.right_shift(np.bitwise_and((five_byte), 192), 6)


    #重组帧
    frame_pixels=np.zeros(shape=(height,new_width))
    frame_pixels[:, 0: new_width:4]=one_byte[:, 0: packet_num_L]
    frame_pixels[:, 1: new_width:4]=two_byte[:, 0: packet_num_L]
    frame_pixels[:, 2: new_width:4]=three_byte[:, 0: packet_num_L]
    frame_pixels[:, 3: new_width:4]=four_byte[:, 0: packet_num_L]


    #裁剪无用的数据,这里表示的是0-2559列,包含完整的数据了。
    frame_out=frame_pixels[:,0:width]
    return frame_out


if __name__ == "__main__":
    file_name="imx335_2560x1440_GRBG_mipi.raw"
    image=read_mipi10_file(file_name,1440, 2560)
    image=image/1023


    # 将读取的 image 数据另存为 raw 数据
    output2_file_name = "output2_image.raw"
    # 将图像数据映射到 16 位无符号整数范围
    image_mapped = (image * 1023).astype('uint16')
    image_mapped.tofile(output2_file_name)
    print(f"Image data has been saved to {output2_file_name}")

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ISP
    ISP
    +关注

    关注

    6

    文章

    501

    浏览量

    55255
  • 光信号
    +关注

    关注

    0

    文章

    468

    浏览量

    28473
  • 电信号
    +关注

    关注

    1

    文章

    846

    浏览量

    22041
  • RAW
    RAW
    +关注

    关注

    0

    文章

    21

    浏览量

    4257

原文标题:关于 raw 图像的理解

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FPGA视频图像抓取案例分析

    MYD-CZU3EG-ISP 提供4K分辨率的摄像头功能,同时输出4K分辨率的图像显示到图像输出接口,下面带一起来体验FPGA的图像抓取和图像显示的操作和应用。
    发表于 11-05 12:37 2431次阅读

    调试THS8200时图像能正常输出,但是图像很模糊不清怎么样解决?

    我们在调试THS8200时图像能正常输出,但是图像很模糊不清,跟原来图像相比差太远了,您们能提供一些调试参数给我们吗?或者怎么样解决?
    发表于 01-17 07:18

    浅谈大数据视频图像处理系统技术

    浅谈大数据视频图像处理系统技术近年来,随着计算机、网络以及图像处理、传输技术的飞速发展,视频监控系统正向着高清化、智能化和网络化方向发展。视频监控系统的高清化、智能化和网络化为视频监控图像
    发表于 09-24 15:22

    怎样获取bayer raw图像的AWB的参数?使用什么工具。跪求解...

    参数,烧写,工具用度信的,拍照用三星demo板,分析用imatest,基本思路是搞清楚了,但是要分析测试RAW图像的R/Gr,B/Gr的参数没有工具啊,三星也没有,哪位大神给我一点指导
    发表于 09-26 00:13

    例说FPGA连载101:双摄像头图像采集板级调试

    例说FPGA连载101:双摄像头图像采集板级调试① 连接好硬件,SF-VIP1核心板 + SF-VGA子板 + VGA显示器 + 两个SF-MT9D111子板,并且给VIP核心板上电
    发表于 05-16 21:17

    如何获取raw10格式的图像数据

    我正在使用CX3 DEV板来安装OV5640传感器。现在,使用这个例子,我可以得到YUV格式的图像数据,但是我想得到RAW10格式的图像数据。如何修改代码? 以上来自于百度翻译 以下为原文I am
    发表于 10-15 15:59

    图像频率域分析傅里叶变换

    文章目录傅里叶变换基础傅里叶级数傅里叶积分傅里叶变换一维连续傅里叶变换一维离散傅里叶变换二维离散傅里叶变换正变换反变换卷积卷积定理数字图像DFT空间域和频域图像频域滤波基本步骤图像频率特性分析
    发表于 05-22 07:41

    伺服调试—结合图像分析

    ! 我们都还年轻 ,我们还有无限可能 。 YES!伺服调试—结合图像分析(以松下伺服为例)1. 调试前准备工作:1. 1 推定出来惯量比:1.1.1 如何推定惯量比:1. 2 检查驱
    发表于 06-28 10:09

    智能车竞赛浅谈——图像

    前言本文主要记录一点有关智能车摄像头相关的内容,供入门智能车的同学一个参考,主要参考opencv、图像处理的部分知识来分析描述。认识图像基本含义首先,咱来了解一下图像的基本含义,
    发表于 09-24 15:05

    基于图像分析的黄豆质量评估系统

    基于图像分析的黄豆质量评估系统/基于图像分析的黄豆质量评估系统
    发表于 12-14 17:58 0次下载

    PyTorch教程7.2图像卷积

    电子发烧友网站提供《PyTorch教程7.2图像卷积.pdf》资料免费下载
    发表于 06-05 10:13 0次下载
    PyTorch教程7.2<b class='flag-5'>之</b><b class='flag-5'>图像</b>卷积

    PyTorch教程14.1图像增强

    电子发烧友网站提供《PyTorch教程14.1图像增强.pdf》资料免费下载
    发表于 06-05 14:24 0次下载
    PyTorch教程14.1<b class='flag-5'>之</b><b class='flag-5'>图像</b>增强

    对于极暗场景RAW图像去噪,你是否还在被标定折磨?

    SID[1] 首先提出一套完整的 benchmark 以及 dataset 进行RAW图像低光增强或去噪。为什么要从RAW图像出发进行去噪和低光增强呢?因为其具有更高的上限,具体可以参
    的头像 发表于 08-11 15:47 3128次阅读
    对于极暗场景<b class='flag-5'>RAW</b><b class='flag-5'>图像</b>去噪,你是否还在被标定折磨?

    机器视觉图像增强和图像处理

    对原始获取图像进行一系列的运算处理,称为图像处理。图像处理是机器视觉技术的方法基础,包括图像增强、边缘提取、图像分割、形态学处理、
    发表于 10-23 10:43 4084次阅读
    机器视觉<b class='flag-5'>之</b><b class='flag-5'>图像</b>增强和<b class='flag-5'>图像</b>处理

    机器视觉图像增强和图像处理

    一、图像处理技术概述1.定义对原始获取图像进行一系列的运算处理,称为图像处理。图像处理是机器视觉技术的方法基础,包括图像增强、边缘提取、
    的头像 发表于 10-26 08:07 1888次阅读
    机器视觉<b class='flag-5'>之</b><b class='flag-5'>图像</b>增强和<b class='flag-5'>图像</b>处理