基于fpga的图像处理之图像灰度化处理(Vivado+Modelsim+Matlab联合仿真验证)

news2024/10/7 10:16:42

**

基于fpga的图像处理之图像灰度化处理

**
本文的思路框架:
在这里插入图片描述

①本文采用两种算法进行灰度处理,平均法和加权均值法;加权均值法采用了直接公式求解和查找表两种方式验证
②FPGA设计中三个设计技巧,可用于工程项目借鉴,一是宏定义参数化设计;二是generate if参数定义;三是调用xilinx的rom原语实现ROM核,省去ip核的调用
③通过Matlab实现图片转化hex,存储至原始图片txt文档,用于vivado+modelsim的仿真输入
④将原始图片txt文档,导入fpga开发平台,通过灰度处理算法输出,并将输出数据存储至算法处理后的txt文档
⑤通过Matlab将算法灰度化处理后的txt文档,通过代码转化至图片格式,显示处理
一、图像灰度化处理基础知识
1、基本原理
将彩色图像转化为灰度图像的过程称为图像灰度化处理。
2、RGB888
常见的 24 位深度彩色图像RGB888 中的每个像素的颜色由 R、G、B 三个分量决定,并且三个分量各占 1 个字节,每
个分量可以取值 0~255,这样一个像素点可以有 1600 多万(255255255)的颜色的变化范围。
3、YUV和YCbCr
YUV(YCbCr)是欧洲电视系统所采用的一种颜色编码方法。在 YUV 色彩空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。Y表示明亮度(Luminance 或 Luma),也就是灰阶值;
U和V表示色度(Chrominance 或 Chroma),用于描述影像的饱和度和色调。
4、灰度化图像的方法
彩色转灰度比较简单的方法就是直接拿 RGB 中的一个通道来显示灰度图像,这种方法简单且不做任何的处理。
下面介绍几种常用的求取灰度图像的方法:
4.1、 平均法
I(x,y)表示灰度图像,取彩色图像 RGB 三个通道每个值的 1/3 相加,公式如下:
I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)
4.2、 加权均值法
I(x,y)表示灰度图像,取彩色图像 RGB 三个通道每个值乘相应的权值后相加,公式如下:
I(x,y) = 0.299 * I_R(x,y) +0.587 * I_G(x,y)+ 0.114 * I_B(x,y)
这是最流行的方法。几个加权系数 0.299,0.587,0.114 是根据人的亮度感知系统调节出来的参数,是个广泛
使用的标准化参数。
YCbCr 转换RGB 公式:
Y = 0.2568R + 0.5041G + 0.0979B + 16;
Cb = -0.1482
R - 0.2910G + 0.4392B + 128;
Cr = 0.4392R - 0.3678G - 0.0714*B + 128;
二、Matlab实现原始图片转化hex和图像灰度化处理后图片显示
1、原始图片转化hexmatlab源码
此源码为一张图片的显示,生成hex为24bit的RGB888数据。若为多张,可以修改。
clear;clear all;clc;
%获取图像
image_in = imread(‘lena_1280x720.jpg’);
imshow(image_in),title(‘The original image’);
%生成图像txt文件
FileName=[‘image_’,num2str(size(image_in,1)),‘_’,num2str(size(image_in,2)),‘.txt’];
[row,col,n] = size(image_in);
fid = fopen(FileName,‘w’);
for x = 1:row
for y = 1:col
image_R = dec2hex(image_in(x,y,1));
image_G = dec2hex(image_in(x,y,2));
image_B = dec2hex(image_in(x,y,3));
[rm,rn]=size(image_R);
[gm,gn]=size(image_G);
[bm,bn]=size(image_B);
if rn == 1
image_R =[‘0’,image_R];
elseif rn == 0
image_R =‘00’;
end
if gn == 1
image_G =[‘0’,image_G];
elseif gn == 0
image_G =‘00’;
end
if bn == 1
image_B =[‘0’,image_B];
elseif bn == 0
image_B =‘00’;
end
image_hex=[image_R,image_G,image_B];
fprintf(fid,‘%s\n’,image_hex);
end
end
fclose(fid);
2、图像灰度化处理后图片显示hexmatlab源码
clear;clear all;clc;
row = 720;
col = 1280;
n = 3;
image_sim_pass = uint8(zeros(row,col,n));
fid = fopen(‘image_720_1280_gray_out.txt’,‘r’);
for x = 1:row
for y = 1:col
RGB = fscanf(fid,‘%s’,1);
image_sim_pass(x,y,1) = uint8(hex2dec(RGB(1:2)));
image_sim_pass(x,y,2) = uint8(hex2dec(RGB(3:4)));
image_sim_pass(x,y,3) = uint8(hex2dec(RGB(5:6)));
end
end
fclose(fid);
image_sim_pass1 = uint8(zeros(row,col,n));
fid1 = fopen(‘image_720_1280_gray_out1.txt’,‘r’);
for x = 1:row
for y = 1:col
RGB1 = fscanf(fid1,‘%s’,1);
image_sim_pass1(x,y,1) = uint8(hex2dec(RGB1(1:2)));
image_sim_pass1(x,y,2) = uint8(hex2dec(RGB1(3:4)));
image_sim_pass1(x,y,3) = uint8(hex2dec(RGB1(5:6)));
end
end
fclose(fid1);
image_1 = imread(‘lena_1280x720.jpg’);
subplot(3,1,1);
imshow(image_1), title(‘The original image’);
subplot(3,1,2);
imshow(image_sim_pass),title(‘After processing images’);
imwrite(image_sim_pass,‘lena_1280x720_sim_pass.jpg’);
subplot(3,1,3);
imshow(image_sim_pass1),title(‘After processing images1’);
imwrite(image_sim_pass1,‘lena_1280x720_sim_pass1.jpg’);
三、FPGA图像灰度化处理源码
1、灰度化处理算法之平均值法
求平均法GRAY = (R+B+G)/3=((R+B+G)85)>>8 = ((R+B+G)(26+24+2^2+1))>>8
在这里插入图片描述

2、灰度化处理算法之加权均值法(直接公式法)
典型灰度转换公式Gray = R0.299+G0.587+B0.114=(R77 + G150 + B29) >>8
在这里插入图片描述

3、灰度化处理算法之加权均值法(查找表法)
将RGB888对应的256组数值,预先存放于rom中,采用rom直接查表实现
在这里插入图片描述
在这里插入图片描述

四、FPGA开发技巧
1、宏定义使用技巧
基于输入数据可能存在RGB565和RGB888两种数据格式,因此采用宏定义方式来兼容不同的接口
采用
`define RG565
定义接口RGB565接口,否则为RGB888数据接口

采用
`ifdef
···

`else
····

`endif
来实现两种不同接口的功能设计

在这里插入图片描述

2、generate if参数定义
通过generata if···else if ···endgenerate来实现不同代码的功能实现,参数化定义
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、调用xilinx的rom原语实现ROM核,省去ip核的调用
采用rom原语导入初始化mem文件,可省去来回生成ip的繁琐工作,便于代码移植和开发
在这里插入图片描述

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

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

相关文章

Redis了解

Redis 源码大概做了哪些事情? 设置默认参数创建对象、持久化定时器回调加载文件参数 (使用配置文件替代部分默认参数)加载文件数据写入字典创建client connect事件handler(accept后,写入读写事件select(),最新的版本用epoll&…

xlsx 导出 (简单使用)

下载数据为xlsx 安装 npm install xlsx 在src下创建文件utils文件夹,在utils文件夹下创建XLSX.js文件 // 下载excel功能 import * as XLSX from xlsx/*** param dataList 表格数据内容 array* param fileName 文件标题。必须以 .xlsx结尾*/ export const download…

Linux网络——Shell编程之快捷命令

Linux网络——Shell编程之快捷命令 一、快捷排序 — sort 命令二、快捷去重 — uniq 命令三、快捷替换 — tr 命令四、快速裁剪 — cut 命令五、文件拆分 — split 命令六、文件合并 —paste 命令七、变量扫描器 — eval 命令 一、快捷排序 — sort 命令 sort命令用于以行为单位…

五步看平台,选好安全的MT4交易外汇平台

在选择MT4外汇交易平台时,如何避免不正规的平台?以下是5招教你远离不正规MT4交易外汇平台。 1. 查看平台是否取得合法许可证 首要考虑的是该平台是否取得了合法的许可证。许可证是证明一个交易平台合法的最重要证据,因此务必在选择时核查该平台的许可证…

得物深入浅出解析JVM中的Safepoint

1.初识Safepoint-GC中的Safepoint 最早接触JVM中的安全点概念是在读《深入理解Java虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样,都是通过这样的方式第一次对安全点有了初步认识。不妨,先复习一下《深入理解Java虚拟机》书中安全点那一章…

你真的了解Java类加载机制吗?

大家好,我是小米,一个喜欢分享技术的程序员。今天我来给大家简述一下Java类加载模型。 在Java中,类的加载过程是在程序运行时动态进行的。Java的类加载模型可以分为三个步骤:加载、连接和初始化。 类加载过程:加载 首…

Android面试指南:谈谈你对Flutter的理解

一、Flutter简介 Flutter是由Google开发的一种基于Dar编程语言的移动应用开发框架。可以帮助开发在构建高性能、美观、灵活的应用程序,从而实现跨平台开发,适用于与Android、ios、web、windows、macOS和linux等多个平台。 二、学习Flutter有什么优势 …

Java EE企业级应用开发(SSM)第11章

第11章SSM框架 一.预习笔记 1.准备jar包(注意版本) Spring一套包 Springmvc两个 Mybatis一个 Spring整合mybatis一个 Jstl一个用于jsp显示数据 Mysql一个用于访问数据库 Gson一个用于返回json数据 2.准备配置文件web.xml applicationContext.xml…

MySQL Client

MySQL客户端很多,自身携带的一些客户端工具也需要了解,方便快速测试。 MySQL Shell MySQL Shell Commands。 执行SQL语句时,必须切换到SQL模式。Shell指令较少,同时可以使用Python \py模式。 MySQL Shell所有的命令后面不需要加…

TCP通道和共享链路通道

推送SDK为了适应不同的场景和需求,对于一些对消息及时性、可靠性、自定义性要求高的应用,如即时通讯、社交、游戏等,可能更倾向于使用TCP通道,对于一些对消息节省流量、耗电量、兼容性要求高的应用,如新闻、天气、股票…

【软件工程】自动化测试保证卓越软件工程能力(3)

测试目标定义 对照目标系统,如下: 给出自动化测试平台目标如下: Case levelCase briefReport send toOVERALLUser 1 -> Process -> Customer 1BossLevel 1User 1 -> Process -> Customer 1 User 1 -> Process -> Custome…

AI自动写文章工具-ai文章智能生成器

随着人工智能技术的快速发展,越来越多的应用开始使用AI自动生成文章的功能,实现全自动、高质量和高效率的文章写作。本文将从全自动批量生成、没有错别字和标准语法、自动插入图片以及严格按照标准格式结构生成几个方面,展开对AI自动生成文章…

数据分析04——Pandas简介/Series对象/DataFrame对象

1、Pandas简介: Pandas是基于NumPy开发的数据分析三大剑客之一,Python数据分析的核心库提供快速、灵活、明确的数据结构Series对象:一维数组结构,由index和value构成DataFrame对象:二维数组结构,由index、…

MySQL基础(二十五)InnoDB数据存储结构

1 数据库的存储结构:页 索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作…

在外Windows公网远程连接MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章:公网远…

友元函数,友元类,内部类及其之间的关系,匿名对象等

TIPS 当某一个类当中有自定义类型成员变量的时候,然后对该类的实例化对象调用函数的时候走初始化列表的时候,如果说要对自定义类型成员变量进行初始化列表初始化的时候,尽管那个自定义类型它的构造函数是没有参数的,但是此时括号…

数据剖析更灵活、更快捷,火山引擎 DataLeap 动态探查全面升级

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 近期,火山引擎 DataLeap 上线“动态探查”能力,为用户提供全局数据视角、完善的抽样策略,提高数据探查的灵活度以及响应速率。 …

【STL模版库】string类:模拟实现string类

一、成员变量 private:char *_str;size_t _size;size_t _capacity;public:static size_t npos -1; //编译报错,不能在类中初始化const static size_t npos -1; //[1]const char* c_str() const{ //[2]return _str;}size_t size() const{return _size;} size_t ca…

智慧水务云平台助力“十四五”水安全保障规划!

一、《“十四五”水安全保障规划》 水利部印发《“十四五”水安全保障规划》,规划中指出,“十四五”期间要抓好8个方面重点任务。 一是实施国家节水行动,强化水资源刚性约束。 二是加强重大水资源工程建设,提高水资源优化配置能…

Mongo执行计划explain分析

3.0+的explain有三种模式,分别是:queryPlanner、executionStats、allPlansExecution。现实开发中,常用的是executionStats模式。 1.使用方式 在查询语句后面加上explain("executionStats") db.user.find({"roleCodes":"xsbj","status&…