通常我们看到的图像是经过相机系统的一系列处理得到的,对于相机工程师和算法研究人员而言,获取传感器原图像以及知道图像所经过的一系列处理过程有助于设计计算步骤或者调试参数来得到更令人满意的图像,本文简单模拟cmos传感器采集的raw图像到最终看到的rgb图像的过程,该过程只为了揭示raw图像处理过程中必不可少的一些步骤,并不是一个完整的ISP pipeline。

从cmos传感器采集到的raw数据是对于拍摄场景的光照强度的记录,人眼通常没有办法直接从这个raw数据中直观地得到场景信息的,消费类电子所采用的cmos传感器普遍是单通道的图像传感器,每个像素只记录了一个通道信号,通过设计滤光阵列的摆放方式,采用信号插值的方式将单通道信号恢复成三通道信号,然后经过一系列的色彩和亮度处理得到最终的图像信号。

本文的raw图像处理pipeline如下图所示:

从raw图像处理流水线可知,raw图像经过如下几个基本步骤:

  1. 线性化矫正:我们希望图像传感器记录的数据是和光照强度成正比的,然而有些传感器在某段强度下的相应是非线性的,这个时候就需要我们根据传感器标定的线性化表来对记录的raw数据进行线性化矫正;

  2. 白平衡矫正:由于不同的传感器使用的材料和工艺上的不同,经过滤光片记录下的黑白灰中性色区域的r/g/b三个通道的数据相差很远,这就会导致本来应该是黑白灰的颜色变成其他颜色,白平衡矫正模块就是统计本来应该是白色的地方,r/g和b/g的比例,然后将本应该是白色的区域矫正回白色;

  3. 去马赛克:在消费类电子产品中通常采用的传感器在记录光强信号的感光区域前的微透镜上镀上一层滤光片,这个滤光片成为颜色滤光阵列(color filter array),这个颜色滤光阵列需要经过特殊的设计才能过插值的算法更好的恢复出光谱信息,通常采用的颜色滤光阵列为bayer阵列,bayer阵列利用人眼对绿色敏感的原理,在一个2x2的区块内,在对角线上镀上两个绿色滤光片,一个红色滤光片,一个蓝色滤光片,故bayer滤光阵列有“RGGB”, “BGGR”, “GRBG”, “GBRG”四种模式,通过滤光阵列采集到的图像每个像素处只有一个通道的像素值,bayer raw数据借助插值算法将每个像素点只有r或g或b的单通道的bayer数据插值成每个像素点含有rgb三通道数据图像的过程称之为去马赛克(demosaicking),有时也称之为颜色阵列插值(color filter array interpolation, CFAI);常见bayer格式如下图所示:

    去马赛克过程如下图所示:

  1. 颜色空间转换:在完整的ISP pipeline中,有多个颜色空间转换模块,方便在不同的颜色空间中进行颜色或者亮度上的图像处理,在本文的pipeline中,这里的颜色空间转换指的是将camera sensor中的sensor rgb数据转换到某个通用的颜色空间中,这里使用的通用颜色空间是Adobe提出的是RGB空间
  2. 色调映射:色调映射通常用来对亮度范围进行调整,在完整的ISP pipeline中,通常包括global tone mapping和local tone mapping,分别用来对全局亮度调整和对局部亮度进行调整,本文中的色调映射仅仅用来对全局亮度进行一个简单的提亮
  3. 伽马矫正:gamma矫正通常是为了对传感器暗部的显示进行补偿,通常采用2.2的gamma,这里也采用2.2的gamma对图像进行gamma补偿矫正

这里给出matlab示例代码对上述pipeline过程进行简单模拟实现:

%% image list
imgName = 'sample.DNG';%% parameter reading and setting
meta_info = imfinfo(imgName);
isp_bayer_pattern = 'rggb';
isp_black = 0;
isp_white = meta_info.SubIFDs{1}.WhiteLevel;
isp_linearization_table = meta_info.SubIFDs{1}.LinearizationTable;
isp_wb_gain_r = meta_info.AsShotNeutral(2) / meta_info.AsShotNeutral(1);
isp_wb_gain_g = meta_info.AsShotNeutral(2) / meta_info.AsShotNeutral(2);
isp_wb_gain_b = meta_info.AsShotNeutral(2) / meta_info.AsShotNeutral(3);
isp_rgb2xyz = [0.4124564, 0.3575761, 0.1804375; 0.2126729, 0.7151522, 0.0721750; 0.0193339, 0.1191920, 0.9503041];
isp_xyz2cam = [0.6653, -0.1486, -0.0611; -0.4221, 1.3303, 0.0929; -0.0881, 0.2416, 0.7226];
isp_cst_matrix = reshape(meta_info.ColorMatrix2, 3, 3)';
isp_gamma = 2.2;
isp_brighten_scale = 0.25;%% read raw data from file
raw = readRawImgFromDng(imgName, meta_info);%% linearization
raw = isp_linearization_table(raw + 1);%% scale image
lin_bayer = scaleImage(raw, isp_black, isp_white);%% white balance
balanced_bayer = whiteBalanceCorrection(lin_bayer, isp_wb_gain_r, isp_wb_gain_g, isp_wb_gain_b, isp_bayer_pattern);%% demosaicing
lin_rgb = demosaicking(balanced_bayer, isp_bayer_pattern);%% color sapce transform
lin_srgb = colorSpaceTransform(lin_rgb, isp_rgb2xyz, isp_xyz2cam);%% birghtness control
lin_srgb = brightenToneMapping(lin_srgb, isp_brighten_scale);%% gamma correction
nl_srgb = gammaCorrection(lin_srgb, isp_gamma);%% show image
figure, imshow(nl_srgb);%% write image
imwrite(nl_srgb, 'final_result.bmp')

输入raw图及其局部放大:

去马赛克之后的图像:

颜色空间转换到srgb空间后的图像

色调映射提亮后的图像:

伽马矫正之后的图像


本文参考自布朗大学的计算摄影学的lab2的实验,目前在美国很多大学开设了计算摄影学的研究生课程,对于相机或者计算摄影的课程可以在搜索引擎中搜索computational photography关键字,可以得到MIT,Stanford,Brown U等大学开设的相关课程,这些课程基本囊括了相机算法设计相关领域,学习下来一定会收益良多的。

为了方便读者重复该过程,笔者将仿真图像及代码放在如下链接
https://download.csdn.net/download/luzhanbo207/33237881

另外,在github上有人发布了一个类似的代码,称为simple-camera-pipeline,其链接如下:
https://github.com/AbdoKamel/simple-camera-pipeline

如果不能复现,可以私信笔者

参考文献:

  1. https://cs.brown.edu/courses/csci1290/labs/lab_raw/index.html

从相机raw图像到日常看到的jpeg图像相关推荐

  1. Adobe欲统一相机RAW格式的格式——DNG数码负片

    Adobe欲统一相机RAW格式的格式--DNG(Digital Nagetive 数码负片) RAW的原意就是"未经加工".可以理解为:RAW图像就是CMOS或者CCD图像感应器将 ...

  2. Adobe欲统一相机RAW格式的格式——DNG数码负片_我是亲民_新浪博客

    Adobe欲统一相机RAW格式的格式--DNG(Digital Nagetive 数码负片) RAW的原意就是"未经加工".可以理解为:RAW图像就是CMOS或者CCD图像感应器将 ...

  3. Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#)

    Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#) Baumer工业相机 Baumer工业相机SDK联合OpenCVS ...

  4. OpenCV中的相机失真、内外参、不失真图像、相机校准

    OpenCV中的相机失真.内外参.不失真图像.相机校准 1. 效果图 2. 原理 2.1 相机校准 2.2 用到的方法 3. 源码 参考 这篇博客将介绍相机的失真.相机的内在和外在参数等,并学习找到这 ...

  5. 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析

    看了很多讲解针孔相机模型中从世界坐标系--->到相机坐标系-->图像坐标系的文章,心里的疑惑也逐渐展开,现在总结一下自己的理解: 世界坐标系.相机坐标系.图像物理坐标系.图像像素坐标系在我 ...

  6. 如何从失焦的图像中恢复景深并将图像变清晰?

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 到目前为止,我已经介绍了两种用于将模糊的图像变清晰的技术,它们分别是: 去卷积:怎么把模糊的图像变清晰 ...

  7. 计算机视觉学习(三):仿射变换将一幅图像放置到另一幅图像中

    本例子为通过仿射扭曲变换将图像放置到另一幅图像中,使得它们能够和指定的区域或者标记物对齐. 运行的代码如下: # test.py from PCV.geometry import warp, homo ...

  8. 图像特征-上篇(10大图像特征)

    图像特征 和文本特征类似,图像特征也是梯度提升树模型非常难以挖掘的一类数据,目前图像相关的问题,例如图像分类,图像分割等等几乎都是以神经网络为主的模型,但是在一些多模态的问题中,例如商品搜索推荐的问题 ...

  9. 【图像超分辨(SR)】图像超分辨领域一些英文名词最通俗的中文解释

    Motivation 博主算是刚入超分辨的坑没多久,自己在看论文的时候,会遇到很多名词,拆开来每个单词我都认识,但是组合起来就是不知道他在讲什么- 最难受的是很多名词都缺乏中文(甚至英文)的解释.可能 ...

最新文章

  1. P4145 上帝造题的七分钟2 / 花神游历各国(线段树区间开平方)
  2. Machine Learning week 3 quiz : Regularization
  3. 有关“双重检查锁定失效”的说明
  4. 【学习笔记】juc并发学习+关于锁的面试题
  5. QT计算机控制进程,Qt 学习之路 2(69):进程
  6. 社工库网址与制作方法
  7. Hibernate3 jar包的作用[转]
  8. os.getcwd上两级_Python os.getcwd() 方法
  9. 引用传递(Java)
  10. 【服务器】在 iPad 上运行 VSCode(宝塔+code server)
  11. 文件包含漏洞的审计(审计思路)
  12. mfc控件设置颜色(超全)
  13. 委托、事件 茴字有几种写法
  14. RabbitMQ heartbeat原理
  15. go语言不用complex包实现二值运算复数计算器
  16. jinkens搭建及部署项目
  17. 已删除的回收站文件恢复方法
  18. C#从IE浏览器获取Cookie
  19. 编译程序与解释程序的区别
  20. 【js html】对于img图片的引用填充,src可以给什么值?

热门文章

  1. 360安全卫士qurl.f.360.cn分析
  2. android WebView套壳 H5微信支付
  3. 神经网络入门:正反向传播推导、CNN 初识
  4. 【小程序·云开发】手动把小程序项目变成云开发项目
  5. 发那科机器人GI分配_干货 | Fanuc机器人IO配备和UI/UO配备
  6. 逻辑学 笔记一 推论的有效性和可靠性
  7. centos搭建本地yum源:
  8. d2l的一些库解析,用到什么补充什么【深度学习+d2l+torch】
  9. android小闹钟课程设计,小闹钟的教学设计
  10. php图片渲染字体缺失,ppt显示此文稿缺少字体怎么解决