基于FPGA的Bayer转RGB算法实现

news/2024/12/27 15:55:04/

1 概述

       Bayer转RGB在图像处理中被称为去马赛克(Demosaic),是机器视觉ISP流程中的一个基础且重要的算法,主要完成彩色图像传感器原始的Bayer格式图像到RGB格式图像的转换。

       关于Bayer图像的相关概念和知识,本文不作介绍。常见知识点以及各种Bayer转RGB算法的介绍网上有很多博文可以参考学习:

https://www.cnblogs.com/qiqibaby/p/5267566.html

三种Bayer数据的插值算法(CCD插值算法)_bayer插值_simple_96的博客-CSDN博客

https://www.cnblogs.com/qiqibaby/p/8719252.html

https://www.cnblogs.com/sunny-li/p/8641767.html

http://www.voidcn.com/article/p-zeuhnrel-ww.html

       Bayer转RGB的核心思想就是色彩插值。各种不同算法主要目的都是真实还原图像的色彩,并解决物体边缘、色彩变化处出现的拉链效应和色彩混叠现象。

2 基于梯度校正的线性插值法

       Bayer转RGB的算法有很多种,很多算法在插值过程中都会考虑领域色彩的梯度,根据梯度对插值结果进行补偿或校正。考虑到在FPGA中实现的效果和资源使用问题,选取了一种经典的算法:gradient-corrected linear interpolation,出自微软研究院,该算法被matlab中的demosaic函数所使用。

       算法论文链接:http://research.microsoft.com/pubs/102068/Demosaicing_ICASSP04.pdf

       该算法的主要原理为:在5*5大小的窗口中,利用中心点像素所属颜色的梯度值对其它颜色的插值结果进行补偿。其中,R和B都考虑了上下左右4个方向的梯度;G除了上下左右4个方向,还考虑了4个对角线方向的梯度,这应该是由于G的像素点个数是R和B的2倍,而且人眼对于绿色的敏感度更强。

       一共有8种情况,4种计算公式。如下图所示:

       4种顺序的bayer阵列对应的R、G、B插值方式如下图所示:

        算法对应的matlab程序为:

function out=bayer_to_rgb(in) 
m=size(in,1);n=size(in,2); outR=in; 
outG=in; 
outB=in; %rg 
%gb 
for i=3:2:m-3 for j=3:2:n-3 outR(i,j)=in(i,j)*8; outG(i,j)=(in(i-1,j)+in(i,j-1)+in(i,j+1)+in(i+1,j))*2-(in(i-2,j)+in(i+2,j)+in(i,j-2)+in(i,j+2))+in(i,j)*4; outB(i,j)=(in(i-1,j-1)+in(i-1,j+1)+in(i+1,j-1)+in(i+1,j+1))*2-(in(i-2,j)+in(i,j-2)+in(i,j+2)+in(i+2,j))*3/2+in(i,j)*6; end 
end %gr 
%bg 
for i=3:2:m-3 for j=4:2:n-2 outR(i,j)=in(i,j-1)*4+in(i,j+1)*4+(in(i-2,j)+in(i+2,j))/2-(in(i-1,j-1)+in(i-1,j+1)+in(i+1,j-1)+in(i+1,j+1)+in(i,j-2)+in(i,j+2))+in(i,j)*5; outG(i,j)=in(i,j)*8; outB(i,j)=(in(i-1,j)+in(i+1,j))*4-(in(i-2,j)+in(i-1,j-1)+in(i-1,j+1)+in(i+1,j-1)+in(i+1,j+1)+in(i+2,j))+(in(i,j-2)+in(i,j+2))/2+in(i,j)*5; end 
end%gb 
%rg 
for i=4:2:m-2 for j=3:2:n-3 outR(i,j)=(in(i-1,j)+in(i+1,j))*4-(in(i-2,j)+in(i-1,j-1)+in(i-1,j+1)+in(i+1,j-1)+in(i+1,j+1)+in(i+2,j))+(in(i,j-2)+in(i,j+2))/2+in(i,j)*5; outG(i,j)=in(i,j)*8; outB(i,j)=(in(i,j-1)+in(i,j+1))*4-(in(i-1,j-1)+in(i-1,j+1)+in(i,j-2)+in(i,j+2)+in(i+1,j-1)+in(i+1,j+1))+(in(i-2,j)+in(i+2,j))/2+in(i,j)*5; end 
end %bg 
%gr 
for i=4:2:m-2 for j=4:2:n-2 outR(i,j)=(in(i-1,j-1)+in(i-1,j+1)+in(i+1,j-1)+in(i+1,j+1))*2-(in(i-2,j)+in(i,j-2)+in(i,j+2)+in(i+2,j))*3/2+in(i,j)*6; outG(i,j)=(in(i-1,j)+in(i,j-1)+in(i,j+1)+in(i+1,j))*2-(in(i-2,j)+in(i,j-2)+in(i,j+2)+in(i+2,j))+in(i,j)*4; outB(i,j)=in(i,j)*8; end end out(:,:,1)=outR/8; 
out(:,:,2)=outG/8; 
out(:,:,3)=outB/8;

       原始bayer图:

       插值后的RGB图:

 

 3 FPGA实现

       上述算法的计算过程非常适合FPGA实现,首先在FPGA中实现1个5*5的滑动窗口模块。滑动窗口模块设计见作者这篇博客:

https://blog.csdn.net/MmikerR/article/details/107933017?spm=1001.2014.3001.5502

       然后按照4个公式分别对R、G、B像素点的值进行计算即可。需要注意的是,8种插值情况可以通过将4个公式复用2次来实现,这样可以减少50%的加减运算及对应的FPGA资源。


http://www.ppmy.cn/news/98826.html

相关文章

Oracle——数据操纵DML(一)

STU1 1、不指定字段的整行插入 在STU1中新增一名同学的基本信息,SQL如下: INSERT INTO test.stu1 VALUES(0001,牛牛,男,24,to_date(1988-05-25,YYYY-MM-DD),12外语)格式如下: INSERT INTO 表名 VALUES(值1,值2,...,值n)对于CHAR或VARCHAR等…

python常用知识梳理(必看篇)

下面小编就为大家带来一篇python常用知识梳理(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理: 1)避免…

海康 综合安防管理平台 对接

海康摄像头对接,通过海康综合安防管理平台对接 1. 海康综合安防管理平台介绍 1.1 官网介绍 1.2 个人理解 综合安防管理平台部署之后,有2个系统,一个是综合安防管理平台:是用户端系统,一个是运营中心:是综…

黑客为什么不攻击赌博网站?

攻击了,只是你不知道而已! 同样,对方也不会通知你,告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客,也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件:28岁小伙因赌博…

java boot项目读取yml配置信息

之前 我们讲过 boot的配置文件格式主要有三种 application.properties application.yml application.yaml 我们说推荐用 application.yml 其实从 xml 到 yml 都是要系统去读取他的配置信息 今天 我们就来写一下 在java中读取 yml的配置 这里 我在 yml中多加两个配置 代码如下…

动态链接库

定义 动态链接库(DLL):在程序运行的时候,连接库,程序发布的时候,还需要将库一并打包,不然别人用不了。 静态链接库:在程序编译的时候,链接库,就是把库的代码…

大数据周会-本周学习内容总结015

开会时间:2023.05.28 15:30 线下会议 目录 01【fhzny项目】 02【Spark】 03【调研-数仓构建】 3.1【数仓构建,流程图、架构图、使用场景】 场景选择 组件设计 构建流程 04【专利】 05【导师点评】 01【fhzny项目】 GitLabMyBatis-PlusSpringbo…

秒懂数据湖、数仓关系

数据湖,可以保存任何格式的原始数据,包括类似sql的结构化数据、json/csv/xml/html等半结构化数据、pdf/xlsx/音视频二进制数据等非结构化数据 数据仓库,提供OLAP能力,需要提前定义Schema 参考: 《云原生数据中台&am…