基于FPGA的图像RGB转CIE-Lab实现,包含testbench和MATLAB辅助验证程序

目录

1.算法运行效果图预览

2.算法运行软件版本

3.部分核心程序

4.算法理论概述

4.1RGB颜色空间

4.2CIE-Lab颜色空间

4.3RGB转CIE-Lab算法原理

5.算法完整程序工程


1.算法运行效果图预览

将FPGA的结果导入到matlab,并和matlab的仿真结果进行对比:

2.算法运行软件版本

vivado2019.2

matlab2022a

3.部分核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/08/01  
// Design Name: 
// Module Name: RGB2gray
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// module test_image;reg i_clk;
reg i_rst;
reg [7:0] Rbuff [0:100000];
reg [7:0] Gbuff [0:100000];
reg [7:0] Bbuff [0:100000];
reg [7:0] i_Ir,i_Ig,i_Ib;
wire [7:0] o_X,o_Y,o_Z;
wire [15:0] o_L;
wire signed[15:0] o_A,o_B;
integer fids1,dat1,fids2,dat2,fids3,dat3,jj=0;//D:\D:\FPGA_Proj\FPGAtest\code_proj
initial 
beginfids1 = $fopen("D:\\FPGA_Proj\\FPGAtest\\code_proj\\R.bmp","rb");dat1  = $fread(Rbuff,fids1);$fclose(fids1);
endinitial 
beginfids2 = $fopen("D:\\FPGA_Proj\\FPGAtest\\code_proj\\G.bmp","rb");dat2  = $fread(Gbuff,fids2);$fclose(fids2);
endinitial 
beginfids3 = $fopen("D:\\FPGA_Proj\\FPGAtest\\code_proj\\b.bmp","rb");dat3 = $fread(Bbuff,fids3);$fclose(fids3);
endinitial 
begin
i_clk=1;
i_rst=1;
#1200;
i_rst=0;
end always #5  i_clk=~i_clk;always@(posedge i_clk) 
begini_Ir<=Rbuff[jj];i_Ig<=Gbuff[jj];i_Ib<=Bbuff[jj];jj<=jj+1;
endmain_lab main_lab_u(
.i_clk    (i_clk),
.i_rst    (i_rst),
.i_image_R      (i_Ir),
.i_image_G      (i_Ig),
.i_image_B      (i_Ib),
.o_X            (o_X),
.o_Y            (o_Y), 
.o_Z            (o_Z),
.o_L            (o_L),
.o_A            (o_A), 
.o_B            (o_B)
);integer fout1;
initial beginfout1 = $fopen("X.txt","w");
endalways @ (posedge i_clk)beginif(jj<=66615)$fwrite(fout1,"%d\n",o_X);else$fwrite(fout1,"%d\n",0);
endinteger fout2;
initial beginfout2 = $fopen("Y.txt","w");
endalways @ (posedge i_clk)beginif(jj<=66615)$fwrite(fout2,"%d\n",o_Y);else$fwrite(fout2,"%d\n",0);
endinteger fout3;
initial beginfout3 = $fopen("Z.txt","w");
endalways @ (posedge i_clk)beginif(jj<=66615)$fwrite(fout3,"%d\n",o_Z);else$fwrite(fout3,"%d\n",0);
endinteger fout4;
initial beginfout4 = $fopen("L.txt","w");
endalways @ (posedge i_clk)beginif(jj<=66615)$fwrite(fout4,"%d\n",o_L);else$fwrite(fout4,"%d\n",0);
endinteger fout5;
initial beginfout5 = $fopen("A.txt","w");
endalways @ (posedge i_clk)beginif(jj<=66615)$fwrite(fout5,"%d\n",o_A);else$fwrite(fout5,"%d\n",0);
endinteger fout6;
initial beginfout6 = $fopen("B.txt","w");
endalways @ (posedge i_clk)beginif(jj<=66615)$fwrite(fout6,"%d\n",o_B);else$fwrite(fout6,"%d\n",0);
endendmodule
0X_025m

4.算法理论概述

      RGB和CIE-Lab是两种常用的颜色空间,它们在不同的应用领域中各有优势。RGB颜色空间主要用于显示设备,而CIE-Lab颜色空间则更适用于颜色测量和计算。因此,将RGB颜色空间转换为CIE-Lab颜色空间具有重要的应用价值。

       RGB颜色模式是一种常见的颜色表示方法,它是通过红、绿、蓝三种颜色的不同比例来表示不同的颜色。其中,红、绿、蓝三种颜色的值分别范围在0到255之间。

       CIELAB颜色模式是一种更加科学的颜色表示方法,它是基于人眼对颜色的感知来定义的。CIELAB颜色模式包括三个分量:L表示亮度,a表示绿色到红色的色差,b表示蓝色到黄色的色差。RGB到CIELAB转换可以通过以下步骤进行:

  1. 将RGB颜色模式转换为X, Y, Z三个分量的CIE XYZ颜色模式。
  2. 将CIE XYZ颜色模式转换为CIE Lab*颜色模式。
  3. 计算CIELAB颜色模式的L, a, b三个分量。

4.1RGB颜色空间

       RGB颜色空间是一种基于红、绿、蓝三种基本颜色的颜色空间。在该空间中,任意一种颜色都可以由这三种基本颜色的不同强度组合而成。RGB颜色空间通常用于显示设备,如电视、计算机显示器等。

4.2CIE-Lab颜色空间

       CIE-Lab颜色空间是一种基于人类视觉系统的颜色空间,由国际照明委员会(CIE)制定。在该空间中,颜色的表示与人眼的感知更加一致。CIE-Lab颜色空间由三个分量组成:L表示亮度,a表示红绿色差,b*表示黄蓝色差。

4.3RGB转CIE-Lab算法原理

       RGB转CIE-Lab的转换过程可以分为两个步骤:首先将RGB颜色空间转换为XYZ颜色空间,然后将XYZ颜色空间转换为CIE-Lab颜色空间。

RGB转XYZ

RGB转XYZ的转换公式如下:

X = 0.4124R + 0.3576G + 0.1805B
Y = 0.2126R + 0.7152G + 0.0722B
Z = 0.0193R + 0.1192G + 0.9505B

       其中,R、G、B分别表示红、绿、蓝三个通道的颜色值,取值范围为[0,255]。X、Y、Z表示转换后的XYZ颜色空间的三个分量。

XYZ转CIE-Lab

XYZ转CIE-Lab的转换公式如下:

L* = 116f(Y/Yn) - 16
a* = 500[f(X/Xn) - f(Y/Yn)]
b* = 200[f(Y/Yn) - f(Z/Zn)]

       其中,Xn、Yn、Zn表示XYZ颜色空间的参考白点的坐标值。f(t)是一个非线性函数,定义如下:

f(t) = t^(1/3) (当t>0.008856时)
= 7.787t + 16/116 (当t≤0.008856时)

在FPGA设计过程中,一般将上述公式转换为如下表达式进行处理:


fX = XT .* X.^(1/3) + (~XT) .* (7.787 .* X + 4/29);
fY = YT .* Y.^(1/3) + (~YT) .* (7.787 .* Y + 4/29);
fZ = ZT .* Z.^(1/3) + (~ZT) .* (7.787 .* Z + 4/29);
 

5.算法完整程序工程

OOOOO

OOO

O

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202976.shtml

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

相关文章

使用TouchSocket适配一个c++的自定义协议

这里写目录标题 说明一、新建项目二、创建适配器三、创建服务器和客户端3.1 服务器3.2 客户端3.3 客户端发送3.4 客户端接收3.5 服务器接收与发送 四、关于同步Send 说明 今天有小伙伴咨询我&#xff0c;他和同事&#xff08;c端&#xff09;协商了一个协议&#xff0c;如果使…

【Hadoop_01】Hadoop介绍与安装

1、Hadoop、HDFS、YARN介绍&#xff08;1&#xff09;Hadoop简介与优势&#xff08;2&#xff09;Hadoop组成&#xff08;3&#xff09;HDFS概述&#xff08;4&#xff09;YARN概述&#xff08;5&#xff09;MapReduce概述 2、安装&#xff08;1&#xff09;Centos7.5软硬件安装…

基于jsp+servlet+mybatis的简易在线选课系统

目录 一.数据库 1.数据库和表的创建 2.数据插入 二.代码实现 1.pojo类 &#xff08;1&#xff09;Course &#xff08;2&#xff09;User &#xff08;3&#xff09;Elective 2.mapper接口 &#xff08;1&#xff09;UserMapper &#xff08;2&#xff09;ElectiveMap…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

D. Jumping Through Segments

显然是一个二分答案&#xff0c;关键是怎么搞判断函数&#xff1f; 我们维护合法的降落区间就好了~ // Problem: D. Jumping Through Segments // Contest: Codeforces - Codeforces Round 913 (Div. 3) // URL: https://codeforces.com/contest/1907/problem/D // Memory Li…

car relative position

如何判断你驾驶的车在路上是否居中 车辆相对位置判断&#xff0c;参考 右侧和路边线交点 看右后视镜&#xff0c;看下大概和边线相差多少

SQL手工注入漏洞测试(Sql Server数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

详解nginx优势以及应用场景,实操编译安装和nginx版本平滑升级

目录 一、nginx的特点 那么nginx有哪些特点&#xff1f; 先讲nginx的优点&#xff1a; 缺点&#xff1a; 二、nginx与Apache的区别 三、nginx的应用场景 四、nginx为什么能支持高并发 五、为什么nginx不使用多线程 六、nginx的两种进程分别有什么作用 七、编译安装ngi…

二叉搜索树——模拟

对于一个无穷的满二叉排序树&#xff08;如图&#xff09;&#xff0c;节点的编号是1,2,3&#xff0c;…。对于一棵树根为X的子树&#xff0c;沿着左节点一直往下到最后一层&#xff0c;可以获得该子树编号最小的节点&#xff1b;沿着右节点一直往下到最后一层&#xff0c;可以…

【办公软件】Win10/Win11复制粘贴必须刷新才能显示

更换了新的一台电脑&#xff0c;但是发现新建文件夹或是复制粘贴文件时&#xff0c;不管是在桌面还是在其他磁盘中都需要右击刷新一下才显示。让人很郁闷&#xff0c;比如新建一个文件夹不显示以为没有新建成功&#xff0c;导致重复建了好几个。 如何解决&#xff1f; 使用Wi…

一步解决 java.io.FileNotFoundException: 找不到文件异常

1.问题描述 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\localhost\uploads\image\20231206\2843cb16-9654-4e52-a757-76e3ca1f80ff.png (系统找不到指定的路径。) 2.原因分析 文件路径中的文件目录不存在 3.解决方案 方案一&#xff1a;如果…

行业研究:2023年中国游戏陪玩行业市场现状分析

近年来随着我国游戏行业的不断发展&#xff0c;我国游戏用户规模也是随着稳步上升&#xff0c;给游戏陪玩行业带来了稳定的用户基础。在用户规模增长的同时&#xff0c;随着经济、文化的快速发展&#xff0c;我国娱乐技能社交也随之逐渐兴起。而作为我国娱乐技能社交比重较大的…

Vue学习计划-Vue2--Vue核心(七)生命周期

抛出问题&#xff1a;一进入页面就开启一个定时器&#xff0c;每隔1秒count就加1&#xff0c;如何实现 示例&#xff1a; <body> <div id"app">{{ n }}<button click"add">执行</button> </div><script>let vm new …

一文搞懂Git版本控制系统

1. Git简介 当涉及到软件开发或协作时&#xff0c;版本管理是一个不可或缺的概念。无论你是一个独立开发者还是一个团队成员&#xff0c;都会遇到需要跟踪和管理代码变更的情况。这时候&#xff0c;Git作为一个强大而流行的版本控制系统就发挥着重要的作用。 Git&#xff08;读…

玩转大数据9:机器学习在大数据分析中的应用

1. 引言 在大数据时代&#xff0c;机器学习在大数据分析中扮演着至关重要的角色。本文介绍机器学习在大数据分析中的重要性和应用场景&#xff0c;并探讨Java中可用的机器学习库和框架。 2. 机器学习的基本概念和算法 机器学习是当今人工智能领域的一个关键分支&#xff0c;…

智慧园区可视化综合管理平台建设方案,智能化、数字化才是关键

园区作为城市的基本单元&#xff0c;是经济发展的重要载体。随着我国经济的快速发展&#xff0c;各类工业园区、办公园区等园区的规划建设也越来越多。伴随着互联网新兴技术的发展和应用&#xff0c;智慧园区已成为当今城市规划和社会发展的关注焦点&#xff0c;今天我们来介绍…

实战oj题——设计循环队列

前言&#xff1a;今天我们来实现循环队列。 各个接口的实现 创建队列&#xff1a; typedef struct {int* a;int front;int back;int k;} MyCircularQueue;我们的队列是由数组储存的&#xff0c;所以我们队列中得定义一个数组&#xff0c;front代表我们的首元素&#xff0c;ba…

腾讯云轻量应用服务器怎么安装BT宝塔面板?

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

Gti GUI添加标签

通过Git Gui打开项目&#xff0c;通过菜单打开分支历史&#xff0c;我这里是名为"develop"的分支 选中需要打标签的commit&#xff0c;右键-Create tag即可 但貌似无法删除标签&#xff0c;只能通过git bash