Python 如何读取RGB 10位原始图像?
我读过一篇有类似问题的文章,但实际上并不适合我。他的图像分辨率为1280x720,文件大小为1843200字节。相机将10位元数据存储到每个像素的16位空间中。虽然它不包含真正的16位数据,但线性拉伸可以完成这项工作。真正的10位格式原始图像的编码可能是什么样的 我的原始图像来自OV5670相机,输出格式为R1C2中的红色(GRBG,不是100%确定,驱动程序就是这样设置的)。分辨率为1920x1080,文件大小:2592000字节。每个像素正好是10位 问题:如何使用Matlab或Python对其进行解码?主要的问题是我不知道像素是如何排列的,因为规范没有提到像素是在2d数组或1d数组中 。(驾驶员没有曝光控制功能,实际图像可能过度曝光) 编辑:这是来自imatest软件的正确图像 传感器像素的结构为:Python 如何读取RGB 10位原始图像?,python,image,matlab,rgb,pixel,Python,Image,Matlab,Rgb,Pixel,我读过一篇有类似问题的文章,但实际上并不适合我。他的图像分辨率为1280x720,文件大小为1843200字节。相机将10位元数据存储到每个像素的16位空间中。虽然它不包含真正的16位数据,但线性拉伸可以完成这项工作。真正的10位格式原始图像的编码可能是什么样的 我的原始图像来自OV5670相机,输出格式为R1C2中的红色(GRBG,不是100%确定,驱动程序就是这样设置的)。分辨率为1920x1080,文件大小:2592000字节。每个像素正好是10位 问题:如何使用Matlab或Python
╔═══════╦═══════╦═══════╦═══════╗
║ B G ║ ... ║ ║ 8 act ║
║ G R ║ ... ║ ║ dummy ║
╠═══════╬═══════╬═══════╬═══════╣
║ ... ║ ║ ║ 1944 ║
║ ... ║ ║ ║ active║
╠═══════╬═══════╬═══════╬═══════╣
║ ║ ║ ║ 8 act ║
║ ║ ║ ║ dummy ║
╠═══════╬═══════╬═══════╬═══════╣
║ ║ ║ ║ 20 ║
║ ║ ║ ║ blk ║
╠═══════╬═══════╬═══════╬═══════╣
║16 act ║ 2592 ║ 16 ║ ║
║ dummy ║active ║ dummy ║ ║
╚═══════╩═══════╩═══════╩═══════╝
我有数据表,但它是保密的。像素的格式与上面的图表类似。Act表示活动线,blk表示黑线。子采样使用2x2装箱
数据表是保密的,互联网上没有公共文件。我发布了一小部分关于它的信息,希望我将其作为参考,并假设同样的信息也适用于OV5670。该表说明编码为每像素10位,我可以使用fread()在matlab中直接读取。此外,我还遵循了工作表中提到的BGGR格式。然后使用简单的demosaic和缩放,我能够读取图像:
% 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()返回一个三维无标度矩阵I\u d。I_d(:,:,1)表示I_d的所有行和所有列,但仅在第一个通道(即“红色”通道)中。demosaic()插值时会生成一些大于2^10的值,并且为了正确显示,需要缩放生成的矩阵(对于double,在0-1之间;对于uint8,在0-256之间)。这就是我试图通过在每个颜色通道上分别使用mat2gray()来实现的。然后我使用cat(3,…)将它们沿通道连接回去。然而,我只是尝试使用一些软件来查看结果,它与代码生成的照片看起来不同。是否需要做进一步的工作?我不认为缩放或demosaic会产生那么大的噪音。看起来数据表中的一些假设可能是错误的。我将再次查看代码。