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

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

问题描述:

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

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

问题:如何用Matlab或Python解码?主要问题是我不知道像素是如何排列的,因为规范没有提及像素是在2d阵列还是1d阵列。

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

EDITED:这里是从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分箱。

该数据表是保密的,互联网上没有公共文件。我发布了一个关于它的一小部分,希望

我用这个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) 

结果是有点颗粒感的图像,但我认为它可以通过适当更好的插值demosiacing步或平滑的缩放过程中得到改善。如果这不是正确的颜色模式,也可以尝试RGGB格式。

enter image description here

+0

你能解释一下I_d的语法(:,:,1)?逗号是做什么的? –

+1

demosaic()返回3维非缩放矩阵I_d。 I_d(:,:,1)表示I_d的所有行和所有列,但仅在第一个通道中为“红色”颜色通道。 demosaic()在插值时产生一些> 2^10的值,并且为了正确的可视化,产生的矩阵需要被缩放(在0-1之间为双倍或在uint8为0-256之间)。这是我正在尝试通过分别在每个颜色通道上使用mat2gray()来完成的。然后,我使用cat将它们连接回信道(3,...) –

+0

但是,我只是试图使用一些软件来查看结果,它与代码生成的照片看起来不同。是否有任何进一步的工作需要完成?我不认为缩放或去马赛克会产生那么大的噪音。 –