如何读取RGB 10位原始图像?

时间:2017-10-05 23:55:14

标签: python image matlab rgb pixel

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

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

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

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

已编辑:以下是imatest软件enter image description here

的正确图片

传感器像素的结构是:

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

我有数据表,但它是保密的。像素格式如上图所示。 Act表示有效行,blk表示黑线。子采样使用2x2 binning。

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

1 个答案:

答案 0 :(得分:2)

我使用此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格式。

enter image description here