如何读取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。 (驱动程序不具有曝光控制功能,实际图像可能是过度曝光)
传感器像素的结构为:
╔═══════╦═══════╦═══════╦═══════╗
║ 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格式。
你能解释一下I_d的语法(:,:,1)?逗号是做什么的? –
demosaic()返回3维非缩放矩阵I_d。 I_d(:,:,1)表示I_d的所有行和所有列,但仅在第一个通道中为“红色”颜色通道。 demosaic()在插值时产生一些> 2^10的值,并且为了正确的可视化,产生的矩阵需要被缩放(在0-1之间为双倍或在uint8为0-256之间)。这是我正在尝试通过分别在每个颜色通道上使用mat2gray()来完成的。然后,我使用cat将它们连接回信道(3,...) –
但是,我只是试图使用一些软件来查看结果,它与代码生成的照片看起来不同。是否有任何进一步的工作需要完成?我不认为缩放或去马赛克会产生那么大的噪音。 –