由于成本和面积等因素的限定,CMOS/CCD在成像时,感光面阵列前通常会有CFA(color filter array),如下图所示,CFA过滤不同频段的光,因此,Sensor的输出的RAW数据信号包含了3个通道的信息。由于人眼对绿色(大约550nm波长)光更敏感,因此CFA阵列包含1/2的G分量,1/4和R和1/4的B分量。

Sensor输出RAW数据后,需要经过Demosaic模块(ISP中)将其转成RGB图像。作为测试,我们可以对一幅全彩色RGB图进行RGB2Bayer转换,将其转换成RAW数据,再进行Bayer2RGB转换,输出RGB,对比输入和输出,可判断算法是否有效。

Bayer2RGB的转换方法有许多,下面给出基于3x3窗口简单插值的代码,支持BGGR、RGGB、GBRG三种bayer格式。输入一幅RGB图像,先进行RGB2Bayer转换,再进行Bayer2RGB转换。

%% ------------------------------------
% Author : lemonHe
% Time : 20180814
% Function : Demosaic
%%------------------------------------ clc;
clear;
close all;
imSrc = imread('detailTest.bmp');
% imSrc = imread('./bayer_data/bayer_1920x1080_12bit.tif');
figure,imshow(imSrc); [hei, wid, chan] = size(imSrc); bayer = uint8(zeros(hei,wid)); %% BGGR
% B G B G B G
% G R G R G R
% B G B G B G
% for ver = 1:hei;
% for hor = 1:wid
% if((1 == mod(ver,2)) && (1 == mod(hor,2)))
% bayer(ver,hor) = imSrc(ver,hor,3);
% elseif((0 == mod(ver,2)) && (0 == mod(hor,2)))
% bayer(ver,hor) = imSrc(ver,hor,1);
% else
% bayer(ver,hor) = imSrc(ver,hor,2);
% end
% end
% end
%
% figure,imshow(bayer);
%
% bayerPadding = zeros(hei+2,wid+2);
% bayerPadding(2:hei+1,2:wid+1) = bayer;
% bayerPadding(1,:) = bayerPadding(3,:);
% bayerPadding(hei+2,:) = bayerPadding(hei,:);
% bayerPadding(:,1) = bayerPadding(:,3);
% bayerPadding(:,wid+2) = bayerPadding(:,wid);
% imDst = zeros(hei+2, wid+2, chan);
%
% for ver = 2:hei+1
% for hor = 2:wid+1
% if(1 == mod(ver-1,2))
% if(1 == mod(hor-1,2))
% imDst(ver,hor,3) = bayerPadding(ver,hor);
% imDst(ver,hor,1) = (bayerPadding(ver-1,hor-1) + bayerPadding(ver-1,hor+1) + bayerPadding(ver+1,hor-1) + bayerPadding(ver+1,hor+1)) / 4;
% imDst(ver,hor,2) = (bayerPadding(ver-1,hor) + bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1) + bayerPadding(ver+1,hor)) / 4;
% else
% imDst(ver,hor,2) = bayerPadding(ver,hor);
% imDst(ver,hor,1) = (bayerPadding(ver-1,hor) + bayerPadding(ver+1,hor)) / 2;
% imDst(ver,hor,3) = (bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1)) / 2;
% end
% else
% if(1 == mod(hor-1,2))
% imDst(ver,hor,2) = bayerPadding(ver,hor);
% imDst(ver,hor,1) = (bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1)) / 2;
% imDst(ver,hor,3) = (bayerPadding(ver-1,hor) + bayerPadding(ver+1,hor)) / 2;
% else
% imDst(ver,hor,1) = bayerPadding(ver,hor);
% imDst(ver,hor,2) = (bayerPadding(ver-1,hor) + bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1) + bayerPadding(ver+1,hor)) / 4;
% imDst(ver,hor,3) = (bayerPadding(ver-1,hor-1) + bayerPadding(ver-1,hor+1) + bayerPadding(ver+1,hor-1) + bayerPadding(ver+1,hor+1)) / 4;
% end
% end
% end
% end
%
% imDst = uint8(imDst(2:hei+1,2:wid+1,:));
% figure,imshow(imDst); %% RGGB
% R G R G R G
% G B G B G B
% R G R G R G
% for ver = 1:hei;
% for hor = 1:wid
% if((1 == mod(ver,2)) && (1 == mod(hor,2)))
% bayer(ver,hor) = imSrc(ver,hor,1);
% elseif((0 == mod(ver,2)) && (0 == mod(hor,2)))
% bayer(ver,hor) = imSrc(ver,hor,3);
% else
% bayer(ver,hor) = imSrc(ver,hor,2);
% end
% end
% end
%
% figure,imshow(bayer);
%
% bayerPadding = zeros(hei+2,wid+2);
% bayerPadding(2:hei+1,2:wid+1) = bayer;
% bayerPadding(1,:) = bayerPadding(3,:);
% bayerPadding(hei+2,:) = bayerPadding(hei,:);
% bayerPadding(:,1) = bayerPadding(:,3);
% bayerPadding(:,wid+2) = bayerPadding(:,wid);
% imDst = zeros(hei+2, wid+2, chan);
%
% for ver = 2:hei+1
% for hor = 2:wid+1
% if(1 == mod(ver-1,2))
% if(1 == mod(hor-1,2))
% imDst(ver,hor,1) = bayerPadding(ver,hor);
% imDst(ver,hor,3) = (bayerPadding(ver-1,hor-1) + bayerPadding(ver-1,hor+1) + bayerPadding(ver+1,hor-1) + bayerPadding(ver+1,hor+1)) / 4;
% imDst(ver,hor,2) = (bayerPadding(ver-1,hor) + bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1) + bayerPadding(ver+1,hor)) / 4;
% else
% imDst(ver,hor,2) = bayerPadding(ver,hor);
% imDst(ver,hor,3) = (bayerPadding(ver-1,hor) + bayerPadding(ver+1,hor)) / 2;
% imDst(ver,hor,1) = (bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1)) / 2;
% end
% else
% if(1 == mod(hor-1,2))
% imDst(ver,hor,2) = bayerPadding(ver,hor);
% imDst(ver,hor,3) = (bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1)) / 2;
% imDst(ver,hor,1) = (bayerPadding(ver-1,hor) + bayerPadding(ver+1,hor)) / 2;
% else
% imDst(ver,hor,3) = bayerPadding(ver,hor);
% imDst(ver,hor,2) = (bayerPadding(ver-1,hor) + bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1) + bayerPadding(ver+1,hor)) / 4;
% imDst(ver,hor,1) = (bayerPadding(ver-1,hor-1) + bayerPadding(ver-1,hor+1) + bayerPadding(ver+1,hor-1) + bayerPadding(ver+1,hor+1)) / 4;
% end
% end
% end
% end
%
% imDst = uint8(imDst(2:hei+1,2:wid+1,:));
% figure,imshow(imDst); %% GBRG
% G B G B G B
% R G R G R G
% G B G B G B
for ver = 1:hei;
for hor = 1:wid
if((1 == mod(ver,2)) && (0 == mod(hor,2)))
bayer(ver,hor) = imSrc(ver,hor,3);
elseif((0 == mod(ver,2)) && (1 == mod(hor,2)))
bayer(ver,hor) = imSrc(ver,hor,1);
else
bayer(ver,hor) = imSrc(ver,hor,2);
end
end
end figure,imshow(bayer); bayerPadding = zeros(hei+2,wid+2);
bayerPadding(2:hei+1,2:wid+1) = bayer;
bayerPadding(1,:) = bayerPadding(3,:);
bayerPadding(hei+2,:) = bayerPadding(hei,:);
bayerPadding(:,1) = bayerPadding(:,3);
bayerPadding(:,wid+2) = bayerPadding(:,wid);
imDst = zeros(hei+2, wid+2, chan); for ver = 2:hei+1
for hor = 2:wid+1
if(1 == mod(ver-1,2))
if(1 == mod(hor-1,2))
imDst(ver,hor,2) = bayerPadding(ver,hor);
imDst(ver,hor,1) = (bayerPadding(ver-1,hor) + bayerPadding(ver+1,hor)) / 2;
imDst(ver,hor,3) = (bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1)) / 2;
else
imDst(ver,hor,3) = bayerPadding(ver,hor);
imDst(ver,hor,2) = (bayerPadding(ver-1,hor) + bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1) + bayerPadding(ver+1,hor)) / 4;
imDst(ver,hor,1) = (bayerPadding(ver-1,hor-1) + bayerPadding(ver-1,hor+1) + bayerPadding(ver+1,hor-1) + bayerPadding(ver+1,hor+1)) / 4;
end
else
if(1 == mod(hor-1,2))
imDst(ver,hor,1) = bayerPadding(ver,hor);
imDst(ver,hor,2) = (bayerPadding(ver-1,hor) + bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1) + bayerPadding(ver+1,hor)) / 4;
imDst(ver,hor,3) = (bayerPadding(ver-1,hor-1) + bayerPadding(ver-1,hor+1) + bayerPadding(ver+1,hor-1) + bayerPadding(ver+1,hor+1)) / 4;
else
imDst(ver,hor,2) = bayerPadding(ver,hor);
imDst(ver,hor,1) = (bayerPadding(ver,hor-1) + bayerPadding(ver,hor+1)) / 2;
imDst(ver,hor,3) = (bayerPadding(ver-1,hor) + bayerPadding(ver+1,hor)) / 2;
end
end
end
end imDst = uint8(imDst(2:hei+1,2:wid+1,:));
figure,imshow(imDst);

结果如下所示:

下图为Sensor输出的RGGB格式RAW数据,使用插值的方法对其进行还原

下面来看看客观指标测试,对于图像复原来说,通过可以根据PSNR和SSIM来评价算法性能。美国Kodak Data公司提供真彩无损图像数据,由专业的全彩色设备采集而来,每个pixel的R、G、B都是通过感光器件得到的,图像大小为512*768,每个通道为8bit。可以对该图像进行降采样,模拟CFA器件,再使用Demosaic算法对采样后的数据进行还原,计算PSNR和SSIM即可评价算法性能。

图像Demosaic算法及其matlab实现的更多相关文章

  1. 【图像配准】基于互信息的图像配准算法:MI、EMI、ECC算法

    简单介绍: 基于互信息的图像配准算法以其较高的配准精度和广泛的适用性而成为图像配准领域研究的热点之中的一个.而基于互信息的医学图像配准方法被觉得是最好的配准方法之中的一个.基于此.本文将介绍简单的基于 ...

  2. 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果

    基于灰度世界.完美反射.动态阈值等图像自动白平衡算法的原理.实现及效果      白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题.白平衡是随着电子影像再现色彩真实 ...

  3. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  4. Python实现图像边缘检测算法

    title: "Python实现图像边缘检测算法" date: 2018-06-12T17:06:53+08:00 tags: ["图形学"] categori ...

  5. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  6. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  7. KFCM算法的matlab程序

    KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...

  8. FCM算法的matlab程序2

    FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...

  9. FCM算法的matlab程序

    FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

随机推荐

  1. 它听键盘声就知道你敲的是什么——GitHub 热点速览 Vol.51

    作者:HelloGitHub-小鱼干 本以为本周的 GitHub 和十二月一样平平无奇就那么度过了,结果 BackgroundMattingV2 重新刷新了本人的认知,还能这种骚操作在线实时抠视频去背 ...

  2. 很多人不知道的Python 炫技操作:海象运算符的三种用法

    Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上. 很多 Python 3.8 的特性还没来得及了解 ...

  3. MySQL在Windows下压缩包方式安装与卸载

    一.MySQL的卸载: 1.停止MySQL服务 2.移除MySQL 二.安装: 1.官网下载压缩版 https://downloads.mysql.com/archives/community/ 2. ...

  4. js中获取监听键盘事件

    <script type="text/javascript" language=JavaScript charset="UTF-8"> docume ...

  5. Powerdesigner中表导出sql语句关于字段注释乱码的问题

    问题说明 注释中的汉字都变成了?,应该是编码的问题. declare @CurrentUser sysname select @CurrentUser = user_name() execute sp ...

  6. alibaba-sentinel-1.8变化

    maven最新坐标 <dependencies> <dependency> <groupId>org.springframework.boot</groupI ...

  7. Spring Boot使用Maven自定义打包方式

    前言:本文将告诉你如何将程序Jar与与依赖Jar及配置文件分离打包,以下列举了两种不同Maven打包方式,其打包效果一致! 一.第一种Maven打包方式,将jar及resources下全部配置文件,拷 ...

  8. 对HTTP请求接口资源下载时间过长的问题分析

    问题描述 我司某产品线有指定业务接口customQuery在线上环境中,与首页一起打开时下载数据的时间明显过长(平均可以达到2s) 注: "与首页一起打开" 的含义是指用户进入WE ...

  9. 用C#实现模拟双色球中奖程序 控制台应用程序

    前言 这是我在大一第一学期C#的课程设计,要求编写一个模拟双色球彩票的控制台应用程序,用以实现简单的模拟选购彩票. 一.双色球购号号码生成: 1.系统购号:通过"随机数"产生双色球 ...

  10. Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程

    Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...