【问题标题】:How can I read the RGB 10 bit raw image?如何读取 RGB 10 位原始图像?
【发布时间】:2018-03-17 16:59:26
【问题描述】:

我读过post 的类似问题,但实际上对我不起作用。他的图像分辨率为 1280x720,文件大小为 1,843,200 字节。相机将 10 位元数据存储到每个像素的 16 位空间中。虽然它不包含真正的 16 位数据,但线性拉伸可以完成这项工作。一个真正的 10 位格式的原始图像大概是像this 这样编码的。

我的原始图像来自 OV5670 相机,输出格式在 R1C2 中为红色(GRBG,不是 100% 确定,驱动程序是这样设置的)。分辨率为 1920x1080,文件大小:2,592,000 字节。每个像素正好是 10 位。

问题:如何使用 Matlab 或 Python 对其进行解码?主要问题是我不知道像素是如何排列的,因为规范没有提到像素是二维数组还是一维数组。

Download the raw file。 (驱动没有曝光控制功能,实际图像可能过曝)

已编辑:这是来自 imatest software的正确图片

传感器像素的结构是:

╔═══════╦═══════╦═══════╦═══════╗
║  B G  ║  ...  ║       ║ 8 act ║
║  G R  ║  ...  ║       ║ dummy ║
╠═══════╬═══════╬═══════╬═══════╣
║  ...  ║       ║       ║ 1944  ║
║  ...  ║       ║       ║ active║
╠═══════╬═══════╬═══════╬═══════╣
║       ║       ║       ║ 8 act ║
║       ║       ║       ║ dummy ║
╠═══════╬═══════╬═══════╬═══════╣
║       ║       ║       ║  20   ║
║       ║       ║       ║  blk  ║
╠═══════╬═══════╬═══════╬═══════╣
║16 act ║ 2592  ║ 16    ║       ║
║ dummy ║active ║ dummy ║       ║
╚═══════╩═══════╩═══════╩═══════╝

我有数据表,但它是机密的。像素的格式类似于我上面的图表。 Act 表示活动线,blk 表示黑线。二次采样使用 2x2 分箱。

数据表是保密的,互联网上没有公开文档。希望我发布了一小部分内容

【问题讨论】:

    标签: python image matlab rgb pixel


    【解决方案1】:

    我将此OV5620 datasheet 用作参考,并假设同样适用于OV5670。该表指出编码是每像素 10 位,我可以使用 fread() 在 matlab 中直接读取。我也遵循了工作表中提到的 BGGR 格式。然后使用简单的去马赛克和缩放,我能够读取图像:

    % Reading
    r = 1920;
    c = 1080;
    
    fin = fopen('v4l2srcnew03.raw');
    I = fread(fin,r*c,'*ubit10');
    I_r = reshape(I,r,c);
    
    % Demosaic
    I_d = demosaic(I_r,'bggr');
    
    % Scale
    I_d_r = mat2gray(I_d(:,:,1));
    I_d_g = mat2gray(I_d(:,:,2));
    I_d_b = mat2gray(I_d(:,:,3));
    I_bggr_rgb = cat(3,I_d_r,I_d_g,I_d_b);
    imshow(I_bggr_rgb)
    

    结果是有点颗粒状的图像,但我认为可以通过在去马赛克步骤中更好的插值或更平滑的缩放来适当地改进它。如果这不是正确的颜色模式,您也可以尝试 RGGB 格式。

    【讨论】:

    • 你能解释一下 I_d(:,:,1) 的语法吗?逗号有什么作用?
    • demosaic() 返回一个 3 维未缩放矩阵 I_d。 I_d(:,:,1) 表示 I_d 的所有行和所有列,但仅在第一个通道中,即“红色”通道。 demosaic() 在插值时会生成一些 > 2^10 的值,并且为了正确可视化,生成的矩阵需要缩放(对于双精度值,在 0-1 之间,对于 uint8,在 0-256 之间)。这就是我试图通过在每个颜色通道上分别使用 mat2gray() 来实现的。然后我使用 cat(3,...) 将它们沿通道连接起来
    • 但是,我只是尝试使用一些软件查看结果,它与代码生成的照片看起来不同。是否需要做进一步的工作?我不认为缩放或去马赛克会产生那么多噪音。
    • 看起来我在数据表中的一些假设可能是错误的。我再看一遍代码。
    猜你喜欢
    • 2017-01-30
    • 2016-05-21
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多