图像Demosaic算法及其matlab实现
由于成本和面积等因素的限定,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实现的更多相关文章
- 【图像配准】基于互信息的图像配准算法:MI、EMI、ECC算法
简单介绍: 基于互信息的图像配准算法以其较高的配准精度和广泛的适用性而成为图像配准领域研究的热点之中的一个.而基于互信息的医学图像配准方法被觉得是最好的配准方法之中的一个.基于此.本文将介绍简单的基于 ...
- 【VS开发】【图像处理】基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
基于灰度世界.完美反射.动态阈值等图像自动白平衡算法的原理.实现及效果 白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题.白平衡是随着电子影像再现色彩真实 ...
- GMM算法的matlab程序
GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...
- Python实现图像边缘检测算法
title: "Python实现图像边缘检测算法" date: 2018-06-12T17:06:53+08:00 tags: ["图形学"] categori ...
- GMM算法的matlab程序(初步)
GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...
- KFCM算法的matlab程序(用FCM初始化聚类中心)
KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...
- KFCM算法的matlab程序
KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...
- FCM算法的matlab程序2
FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...
- FCM算法的matlab程序
FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...
随机推荐
- Python手把手教程之用户输入input函数
函数input() 函数 input() 让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中,以方便你使用. 例如,下面的程序让用户输入一些文本,再将这些文本呈现给 ...
- 这嘎哒真TM那啥!Python版东北话编程火爆网络
还记得那个刷爆朋友圈的那个文言文编程语言么? 这个项目是一位名为Huang Lingdong的大四学生创建的,当时,就连中科院计算所研究员.机器翻译领域知名专家刘群老师都赞叹道: 后生可畏 近日,Gi ...
- SQL 视图 临时表 存储过程 索引 事务
视图: 视图是按照你的sql语句生成的一个虚拟的东西,本身并不占数据库的空间 创建视图 create view view_1 as select id from table_1 当你表里的数据增加或者 ...
- 配置redis服务器允许远程连接
说明 默认情况下,redis只允许本机访问.如果需要外部访问,需要修改下配置文件. 配置修改 redis.windows.conf 将bind 127.0.0.1 注释 将protected-mode ...
- 【mybatis-plus】分页、逻辑删除
通过mybatis-plus实现分页,也是很简单,插件大法. 一.分页 1.配置分页插件 把分页的插件也配置到统一的配置类里: @Configuration // 配置扫描mapper的路径 @Map ...
- 微信支付(PC扫码支付和H5公众号支付)
最近在做微信支付,微信支付比较坑,官方居然只有.NET.C#.PHP的demo居然没有java的demo.然后微信支付是不提供测试账号的需要直接用正式的公众号.首先来介绍下微信扫码支付吧,微信扫码有两 ...
- 总结JAVA语言的十大特性
JAVA语言的十大特性 1.简单 Java语言的语法简单明了,容易掌握从,而且Java语言是纯面向对象的语言. Java语言的语法规则和C++类似,从某种意义上来讲,Java原因是由C语言和C++语言 ...
- mysql5.7.20压缩版安装
1.官网下载.zip格式的MySQL Server的压缩包,选择x86或x64版,并解压. 2. 创建 data文件夹 及 my.ini文件,并编辑 [mysqld] # 设置为自己MYSQL的安装目 ...
- flume集成kafka(kafka开启kerberos)配置
根据flume官网:当kafka涉及kerberos认证: 涉及两点配置,如下: 配置一:见下实例中红色部分 配置conf实例: [root@gz237-107 conf]# cat flume_sl ...
- 项目实战--解决运行sql文件错误
说明: 新项目启动,通过公司运维同学给的数据库脚本在Navicat中建项目的数据库,运行脚本时报错 Error Code: 1227. Access denied; you need (at leas ...