首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

FPGA硬件png图片解码器,支持所有颜色类型解码,提供工程源码和技术支持

  • 25-03-04 15:08
  • 2901
  • 12547
blog.csdn.net

目录

  • 1、前言
    • 免责声明
  • 2、我已有的视频图像编解码方案
  • 3、png图片解码理论
  • 4、png图片解码性能介绍
  • 5、png图片解码器时序介绍
    • 输入码流
    • 输出图像信息和像素
  • 6、png图片解码器设计详解
  • 7、工程源码和仿真
    • 工程代码架构
    • 仿真流程
  • 8、输出RGB图像验证
  • 9、福利:工程代码的获取

1、前言

png 是仅次于jpg的第二常见的图象压缩格式。png支持透明通道(A通道),支持无损压缩,支持索引RGB(基于调色板的有损压缩)。在色彩丰富的数码照片中,png只能获得1~4倍的压缩比。在人工合成图(例如平面设计)中,png能获得10倍以上的压缩比。

本设计使用system verilog语言设计了一个png图片解码器,输入数据为8位的流式数据,输出数据为解码后的32位数据,其中高24位为RGB数据,低8位为透明度数据,实用性和灵活性很高;一并提供了加速器的仿真源文件,可通过vivado或其他软件进行仿真,文章后面有详细的仿真教程;

本文详细描述了png图片解码器及其仿真的设计方案,工程代码可综合编译上板调试,但目前只做到了仿真层面,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像压缩领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、我已有的视频图像编解码方案

我这里目前已有的视频图像编解码方案如下:
1:FPGA实现H264视频解码方案,工程源码和设计说明参考链接:点击直接前往
2:FPGA实现MPEG2视频压缩方案,工程源码和设计说明参考链接:点击直接前往
3:FPGA实现JPEG图像解码方案,工程源码和设计说明参考链接:点击直接前往
4:FPGA实现JPEG-LS图像压缩方案,工程源码和设计说明参考链接:点击直接前往
5:FPGA实现png图片解码方案,即本文。。。

3、png图片解码理论

png图片解码算法介绍可以百度一下或者csdn或者知乎搜一下看看,专业的讲解我不擅长,我只擅长用fpga实现算法,专业讲原理的大佬比我讲得好,这里可以推荐一篇阅读量很大的文章:直接点击前往

4、png图片解码性能介绍

1:基于FPGA的流式的 png 图象解码器,输入 png 码流,输出原始像素;
2:支持图像宽度<4000,高度不限;
3:支持所有颜色类型:灰度、灰度+A、RGB、索引RGB、RGB+A;
4:仅支持8bit深度(大多数 png 图像都是8bit深度);
5:资源消耗少,首先看看在Xilinx Artix-7 xc7a35tcsg324-2 上综合和实现的资源消耗:
在这里插入图片描述
6:解码延时低
在 Xilinx Artix-7 xc7a35tcsg324-2 上部署 png图片解码器,时钟频率= 50MHz (正好时序收敛)。根据仿真时每个图像消耗的时钟周期数,可以算出压缩图像时的性能,举例如下:
在这里插入图片描述
上表中的测试图片我会在工程文件中一并给出,感兴趣的也可以重新测试一遍延时。。。

5、png图片解码器时序介绍

首先看看png图片解码器顶层接口:
在这里插入图片描述

输入码流

png图片解码器的使用方法很简单,以 我给出的测试图片文件夹test_image/img01.png 这张图像为例,如下时序图,在输入一张图象的码流前,先要令 istart 上产生一个高电平脉冲(宽度至少为一个时钟周期),然后通过 ivalid 和 ibyte 信号来输入码流(这张图象的 png 码流有 98 字节,这 98 字节都要逐一输入给 png图片解码器),其中 ivalid 和 iready 构成了握手信号: ivalid=1 时说明外部想发送一个字节给png图片解码器。iready=1 时说明png图片解码器已经准备好接收一个字节。只有 ivalid 和 iready 同时=1 时握手才成功,ibyte 才被成功的输入png图片解码器中。
输入时序

输出图像信息和像素

在输入码流的同时,这张图象的解压结果(也就是图像基本信息和原始像素)会从模块中输出,如下图,在图象的像素输出前,ostart 信号会出现一个时钟周期的高电平脉冲,同时 colortype, width, height 会有效。其中:
width, height 分别是图象的宽度和高度;
colortype 是 png 图像的颜色类型,含义如下:
在这里插入图片描述
然后,ovalid=1 代表该时钟周期有一个像素输出,该像素的 R,G,B,A 通道会分别出现在opixelr,opixelg,opixelb,opixela 信号上。
在这里插入图片描述

6、png图片解码器设计详解

png图片解码器原理框图如下:
在这里插入图片描述
其中顶层的数据输入输出如下:
在这里插入图片描述
具体设计的代码层级讲解这里不多说,要把代码讲清楚写几本书也未必能说清楚,还是拿到代码去仔细品味吧。。。

7、工程源码和仿真

开发板FPGA型号:Xilinx xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:14张png图片;
输出:txt文件;
输出显示:我用的Matlab读取txt显示图片;
运行:Vivado在线仿真;

工程代码架构

工程代码架构如下:
在这里插入图片描述

仿真流程

仿真流程为:
第一步:
添加源码并开启行为仿真:
在这里插入图片描述
第二步:
点击开始仿真:
在这里插入图片描述
该仿真需要运行30分钟;

仿真的输入我准备了共14张png图片,分辨率不一样,基本可以完美的模拟绝大多数类型的png图片了,输入图片文件夹位置如下:
在这里插入图片描述
经过漫长的仿真后会结束,并跑完波形如下:
在这里插入图片描述
此时也生成了对应的14个txt文件,位置如下:
在这里插入图片描述
以out14.txt为例,打开文件:
在这里插入图片描述

8、输出RGB图像验证

使用Matlab将输出的txt文件转为图片显示,再和源png图片做对比,当然,还可以用Python等验证,方法自己喜欢就好。。。
以out14.txt为例,打开out14.txt,并去掉首行字符,如下:
在这里插入图片描述
另存为out14_matlab.txt,位置如下:
在这里插入图片描述
将此文件复制到Matlab源码文件夹下,运行如下Matlab源码即可显示输出RGB图像;Matlab源码如下:

clear;clear all;clc;  
col = 1920; 
row = 1080;
n   = 3;    

image_sim_pass = uint8(zeros(row,col,n));
fid = fopen('out14_matlab.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);
imshow(image_sim_pass),title('png解码后的RGB图片');
imwrite(image_sim_pass,'img14_simout.jpg');   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

打开源png图片和Matlab输出的解码后的RGB图做对比如下:
在这里插入图片描述

9、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述

源码技术支持加我微信哦
微信名片
注:本文转载自blog.csdn.net的9527华安的文章"https://blog.csdn.net/qq_41667729/article/details/130046901"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top