Skip to main content
 首页 » 编程设计

python之如何读取 10 位 Raw 图像其中包含 RGB-IR 数据

2025年05月04日14mengfanrong

我想知道如何从我的 10 位原始数据(它有 rgb-ir 图像数据)数据中提取 rgb 图像?

如何使用 Python 或 MATLAB 阅读?

拍摄时的相机分辨率为 1280x720: 室内照片Image for download 户外写真Image 2 for download

相机型号:e-CAM40_CUMI4682_MOD

非常感谢

请您参考如下方法:

我使用了以下图像处理阶段:

  • 拜耳马赛克颜色 channel 分离。
  • 线性拉伸(stretch)每个颜色 channel 。
  • 简单的白平衡。
  • 用绿色替换 IR 颜色 channel (将图像转换为标准 Bayer 格式)。
  • 恢复拜耳马赛克。
  • 简单的 Gamma 校正。
  • 去马赛克

我没有处理 IR 颜色 channel ,而是将其替换为绿色 channel 。

根据你添加的RGB图片,我找到了CFA订单。
CFA(滤色器阵列)顺序为:

B | G 
-- -- 
IR| R 

以下 Matlab 代码将图像处理为 RGB:

srcN = 1280; 
srcM = 720; 
 
f = fopen('image_raw.raw', 'r'); 
 
%Read as transposed matrix dimensions, and transpose the matrix. 
%The reason for that, is that Matlab memory oreder is column major, and 
%raw image is stored in row major (like C arrays). 
I = fread(f, [srcN, srcM], 'uint16'); 
fclose(f); 
I = I'; 
 
%Convert from range [0, 1023] range [0, 1] (working in double image format). 
I = I/(2^10-1); 
 
%Bayer mosaic color channel separation 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Assume input format is GBRG Bayer mosaic format. 
%Separate to color components. 
B = I(1:2:end, 1:2:end); 
G = I(1:2:end, 2:2:end); 
IR = I(2:2:end, 1:2:end); 
R = I(2:2:end, 2:2:end); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 
%Linear stretching each color channel. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Linear streatch blue color channel. 
B = imadjust(B, stretchlim(B, [0.02 0.98]),[]); 
 
%Linear streatch green channel. 
G = imadjust(G, stretchlim(G, [0.02 0.98]),[]); 
 
%Linear streatch red color channel. 
R = imadjust(R, stretchlim(R, [0.02 0.98]),[]); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Simple white balance 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Median or R, G and B. 
rgb_med = [median(R(:)), median(G(:)), median(B(:))]; 
rgb_scale = max(rgb_med)./rgb_med; 
 
%Scale each color channel, to have the same median. 
R = R*rgb_scale(1); 
G = G*rgb_scale(2); 
B = B*rgb_scale(3); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 
%Restore Bayer mosaic. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Insert streached color channnels back into I. 
I(1:2:end, 1:2:end) = B; 
I(1:2:end, 2:2:end) = G; 
%I(2:2:end, 1:2:end) = G; %Replace IR with Green. 
I(2:2:end, 2:2:end) = R; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Replace IR with green - resize green to full size of image first. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
T = imresize(G, [srcM, srcN]); %T - temporary green, size 1280x720 
I(2:2:end, 1:2:end) = T(2:2:end, 1:2:end); %Replace IR with Green. 
I = max(min(I, 1), 0); %Limit I to range [0, 1]. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Simple gamma correction 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
gamma = 0.45; 
I = I.^gamma; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Demosaic 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Convert to uint8 (range [0, 255]). 
I = uint8(round(I*255)); 
RGB = demosaic(I, 'bggr'); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
imshow(RGB); 

结果:

现在颜色正常了...


户外图像处理:

对室外图像进行“室内”处理,得到如下结果:

白树是近红外光谱渗透到 R、G 和 B 像素(不仅是红外像素)的标志。
植被的叶绿素在近红外光谱中具有高反射。请参阅:http://missionscience.nasa.gov/ems/08_nearinfraredwaves.html‌​ ,然后在 Google 上搜索。
需要从红色、绿色和蓝色 channel 中减去 IR。


我使用了以下图像处理阶段:

  • 拜耳马赛克颜色 channel 分离。
  • 从红色、绿色和蓝色 channel 中减去 IR“剩余”。
  • 线性拉伸(stretch)每个颜色 channel 。
  • 简单的白平衡。
  • 恢复拜耳马赛克。
  • 简单的 Gamma 校正。
  • 去马赛克。
  • 将 RGB 图像调整为较低的分辨率。

以下 Matlab 代码将室外图像处理为 RGB:

srcN = 1280; 
srcM = 720; 
 
f = fopen('ir_6.raw', 'r'); 
 
%Read as transposed matrix dimensions, and transpose the matrix. 
%The reason for that, is that Matlab memory oreder is column major, and 
%raw image is stored in row major (like C arrays). 
I = fread(f, [srcN, srcM], 'uint16'); 
fclose(f); 
I = I'; 
 
%Convert from range [0, 1023] range [0, 1] (working in double image format). 
I = I/(2^10-1); 
 
%Bayer mosaic color channel separation 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Assume input format is GBRG Bayer mosaic format. 
%Separate to color components. 
B = I(1:2:end, 1:2:end); 
G = I(1:2:end, 2:2:end); 
IR = I(2:2:end, 1:2:end); 
R = I(2:2:end, 2:2:end); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 
%Subtract IR "surplus" from R, G and B. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%The coefficients were tuned by trial and error... 
ir_r = 1.3;  % 130% of IR radiation is absorbed by red pixels???  
ir_g = 0.35; % 35% of IR radiation is absorbed by green pixels. 
ir_b = 0.3;  % 30% of IR radiation is absorbed by blue pixels. 
 
IR = imresize(IR, size(I)); %Resize IR to the size of I. 
IR = max(min(IR, 1), 0); %Limit IR to range [0, 1] (because imresize values slightly outside the range of input). 
 
R = R - IR(2:2:end, 2:2:end)*ir_r; %Subtract IR for R (IR scale coefficient is ir_r). 
G = G - IR(1:2:end, 2:2:end)*ir_g; %Subtract IR for G (IR scale coefficient is ir_g). 
B = B - IR(1:2:end, 1:2:end)*ir_b; %Subtract IR for B (IR scale coefficient is ir_b). 
 
R = max(min(R, 1), 0); %Limit IR to range [0, 1]  
G = max(min(G, 1), 0); 
B = max(min(B, 1), 0); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 
%Linear stretching each color channel. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Linear streatch blue color channel. 
B = imadjust(B, stretchlim(B, [0.02 0.98]),[]); 
 
%Linear streatch green channel. 
G = imadjust(G, stretchlim(G, [0.02 0.98]),[]); 
 
%Linear streatch red color channel. 
R = imadjust(R, stretchlim(R, [0.02 0.98]),[]); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Simple white balance 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Median or R, G and B. 
rgb_med = [median(R(:)), median(G(:)), median(B(:))]; 
rgb_scale = max(rgb_med)./rgb_med; 
 
%Scale each color channel, to have the same median. 
R = R*rgb_scale(1); 
G = G*rgb_scale(2); 
B = B*rgb_scale(3); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
 
%Restore Bayer mosaic. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Insert streached color channnels back into I. 
I(1:2:end, 1:2:end) = B; 
I(1:2:end, 2:2:end) = G; 
I(2:2:end, 2:2:end) = R; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Replace IR with green - resize green to full size of image first. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
T = imresize(G, [srcM, srcN]); %T - temporary green, size 1280x720 
I(2:2:end, 1:2:end) = T(2:2:end, 1:2:end); %Replace IR with Green. 
I = max(min(I, 1), 0); %Limit I to range [0, 1]. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Simple gamma correction 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
gamma = 0.45; 
I = I.^gamma; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
%Demosaic 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Convert to uint8 (range [0, 255]). 
I = uint8(round(I*255)); 
RGB = demosaic(I, 'bggr'); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 
RGB = imresize(RGB, size(I)/2); %Shrink size of RGB image for reducing demosaic artifacts. 
 
imshow(RGB); 

结果不是很好,但它演示了可以从红绿蓝 channel 中减去红外 channel 的概念。
还有工作要做...
结果图片:

出现“假色”绿斑的原因:
红色 channel 中的饱和像素(在原始输入中饱和)未正确处理。
可以通过减少曝光(以较短的曝光时间拍摄照片)来解决问题。