基于FPGA的Bayer转RGB算法实现

news2024/12/23 4:23:53

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.coloradmin.cn/o/579942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jquery data和data-属性不一致问题

延申val和value属性同样不一致 <script src"https://code.jquery.com/jquery-3.7.0.min.js"></script> <input type"text" value"F119-PW110" data-tag"F119" id"txtEngine" name"Engine" placeh…

第十六届全国大学生信息安全竞赛创新实践能力赛(CISCN)

目录 Misc 1、被加密的生产流量 Crypto 2、Sign_in_passwd Web 3、unzip 4、dumpit Re 5、babyRE Pwn 6、funcanary Misc 1、被加密的生产流量 下载附件解压后是一段流量&#xff0c;使用wireshark打开 最开始做的时候找错了方向&#xff0c;追踪到了另一个东西 …

阿里云服务器配置怎么选择合适?CPU内存带宽配置

阿里云服务器配置如何选择&#xff1f;个人用户选择通用算力型u1云服务器或轻量应用服务器&#xff0c;2核2G、2核4G配置即可&#xff0c;企业公司用户可以选择独享型ECS计算型c7、通用型g7等&#xff0c;4核8G、8核16G、4核32G等配置&#xff0c;阿里云百科来详细说下不同用户…

实验二十一、积分运算电路的输出波形分析

一、题目 利用 Multisim 分析图1所示两个积分运算电路的输出波形&#xff0c;输入电压为 200 Hz、幅值为 1 V 的方波信号。 图 1 图1\,\, 图1 二、仿真电路 在 Multism 中搭建图1所示的两个电路&#xff0c;如图2所示。为了防止电路中的直流增益过大&#xff0c;故在电容上…

node.js与内置模块

一、目标 能够知道什么是Node.js能够知道Node.js可以做什么能够说出Node.js中的JavaScript的组成部分能够使用fs模块读写操作文件能够使用path模块处理路径能够使用http模块写一个基本的web服务器 二、目录 初始Node.jsfs文件系统模块path路径模块http模块 1.初始Node.js …

[Nacos] Nacos Server处理订阅请求 (九)

文章目录 1.InstanceController#list()2.InstanceController#doSrvIpxt()3.总结 1.InstanceController#list() Nacos Server处理订阅请求 主要还是从请求中获取参数, 比如namespceId、serviceName、agent(指定提交请求的客户端是哪种类型)、clusters、clusterIP、udpPort(后续…

2023全国酒店数据

数据内容字段结构 hotel_id int(11) NOT NULL, name varchar(100) DEFAULT NULL, name_en varchar(100) DEFAULT NULL, short_name varchar(100) DEFAULT NULL, province varchar(20) DEFAULT NULL, city_id int(11) DEFAULT NULL, city varchar(20…

R语言实践——使用rWCVP在WCVP中匹配名称

使用rWCVP在WCVP中匹配名称 加载库工作流1. 示例数据&#xff1a;IUCN红色名录2. 将匹配的名称解析为接受名2.1 模糊匹配2.2 多项匹配2.3 将评估与接受的名称相关联 3. 可视化匹配过程4. 得到最终数据集 加载库 世界维管植物名录提供了所有已知维管植物物种的全球共识观点&…

LabView中条件结构的使用方法1

LabView中的条件结构包含一个或多个子程序框图&#xff0c;即分支&#xff0c;当满足某个条件时&#xff0c;相应的分支会被执行。也就是说&#xff0c;在条件结构执行时&#xff0c;仅有一个分支被执行。当程序存在两种或多种可能性时&#xff0c;可以使用条件结构。 1 创建条…

攻防世界安卓逆向练习

一.easy-so jadx分析程序逻辑 可以看到关键在于cyberpeace.CheckString()函数 双击跟进之后可以发现是native层函数 ida查看so文件 程序逻辑: 将字符串保存到新的空间buffer中第一个判断是将buffer的前16个字符和后16个字符进行交换第二个判断是将buffer的2个相邻的字符互换位…

算法|10.从暴力递归到动态规划3

算法|10.从暴力递归到动态规划3 1.纸牌游戏 题意&#xff1a;给定一个整型数组arr&#xff08;都是正数&#xff09;&#xff0c;代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌&#xff0c;规定玩家A先拿&#xff0c;玩家B后拿。但是每个玩家每次只能拿走最左…

(10) 朴素贝叶斯

文章目录 1 概述2 不同分布下的贝叶斯2.1 高斯朴素贝叶斯GaussianNB2.1.1 认识高斯朴素贝叶斯2.1.2 探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集2.1.3 探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度 2.2 概率类模型的评估指标2.2.1 布里尔分数Brier Score2…

PCIE知识点-022:PCIe 时钟结构

图1&#xff1a;参考时钟结构示意图[4] 1. Common Refclk Architecture Common Refclk Architecture&#xff0c;即同源参考时钟架构&#xff0c;PCIe收发设备共用一个时钟源&#xff0c;是目前是使用最为广泛的方案。 缺点&#xff1a; 对于适用同一 Common Clock 作为参考时…

大数据入门(十三)- HDFS的Shell操作

零.HDFS的Shell操作 一.进程启停管理 1.一键启停脚本 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 1&#xff09;$HADOOP_HOME/sbin/start-dfs.sh&#xff0c;一键启动HDFS集群 执行原理&#xff1a; &#xff08;1&#xff09;在执行此脚本的机器上&#xff0c;启动Secon…

动态规划2:题目

目录 第1题 Fibonacci 第2题 字符串分割(Word Break) .第3题 三角矩阵(Triangle) 第4题 路径总数(Unique Paths) 第5题 最小路径和(Minimum Path Sum) 第6题 背包问题 第7题 回文串分割(Palindrome Partitioning) 第8题 编辑距离(Edit Distance) 第9题 不同子序列(Dist…

Dubbo入门案例

1.基于以下图实现服务 提供者、消费者 2.前期工作 父POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

如何在本地安装多个nodejs版本,方便前端开发

目录 &#x1f4dd;一&#xff0c;使用 nvm&#xff08;Node Version Manager&#xff09;: &#x1f4dd;二&#xff0c;使用 n&#xff08;Node.js 版本管理器&#xff09;: &#x1f4e2;要在本地安装多个 Node.js 版本以便于前端开发&#xff0c;你可以使用工具如 nvm&am…

js常用事件

js常用事件如下&#xff1a; onmouseover&#xff1a;鼠标被移到某元素之上&#xff1b; onmouseout&#xff1a;鼠标从某元素移开&#xff1b; onfocus&#xff1a;元素获得焦点&#xff1b; onblur&#xff1a;元素失去焦点&#xff1b; onclick&#xff1a;鼠标单击事件…

蓝桥杯嵌入式STM32G431RBT6竞赛指南与模板——最后的绝唱

谨以此文和我去年前的一篇蓝桥杯单片机的教程构成电子类的青铜双壁. 国信长天单片机竞赛训练之原理图讲解及常用外设原理&#xff08;遗失的章节-零&#xff09;_昊月光华的博客-CSDN博客 目录 时钟树 串口重定向&#xff1a;printf输出 动态点灯(点灯大师) 按键(常用状态…

RabbitMQ学习-发布确认高级

发布确认springboot版本 确认机制方案&#xff1a; 代码架构图&#xff1a; 配置文件&#xff1a; 在application.properties全局配置文件中添加spring.rabbitmq.publish-confirm-type属性&#xff0c;这个属性有以下几种值 none:禁用发布确认模式(默认)0 correlated:发布消…