FPGA-仿真读写bmp图片

2023-11-05


最近想完成FPGA图像处理,由于没有开发板,就像通过仿真完成,之前像的是通过python 将图像转化为txt文本,最后利用verilog 读取txt文件导入,对像素点进行处理,然后将处理后像素数据写入txt,最后通过python转化为bmp位图,后来发现verilog可以直接读取bmp文件,并且将数据写入bmp文件。方便了很多。

位图说明

BMP文件存储格式
bmp文件的存储格式是Windows系统中广泛使用的图像文件格式,对图像不做任何程度的压缩处理,主要分为位图头文件,位图信息头,调色板信息,像素数据四大部分,由于通常是处理RBG图像,因此仅讨论RGB的情况

位图头文件 :文件的格式、大小等信息,前14Byte;主要关心的是图像尺寸,像素数据开始位置。
位图信息头: 提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,前40Byte;主要关心的是图像宽度,图像高度。
调色板信息: 字,不关心
像素数据 : 像素数据,8bit一个像素数据,即1Byte。

在这里插入图片描述

在这里插入图片描述

位图

在这里插入图片描述
我使用的是上面这个128*128

24位位图: 又名RGB真彩色图,又名RGB真彩色图,含2^24=16 777 216=16M色,没有彩色表。每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red)。
一幅256×256的24位位图大小计算方法:
位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(256×256×3字节)=196 662字节(Byte)

注意:
Windows有“补零”的习惯!即要求位图的每一行像素所占字节数必须被4整除。若不能倍4整除,则在该位图每一行的十六进制码末尾“补”1至3个字节的“00”。
例如:一幅宽253×高256的24位位图,微软在生成该图为实际文件时,计算每一行像素所占字节=宽253×3字节=759字节,检验其被4除余1,则在每行的十六进制码末尾加1个字节,补“00”,变为760字节。因此我们计算该图大小时应先判断是否“补零”,再得出算法:
该图大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(高256×每行760字节)=194614字节(Byte)。
“补零”只针对位图的宽进行检验,一幅宽256×高253的24位位图,
其大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(高253×每行768字节)=194358字节(Byte)< 196 662字节(Byte)
只是把此图像的宽和高颠倒,图像所占内存竟然变小了。

Verilog代码实现

/*******************************************************************************
*                                                                              *
*     (c) Copyright 1995-2017 TAIHO ELE Co,Ltd.                                *
*     All rights reserved.                                                     *
*                                                                              *
********************************************************************************
*                                                                               
*       FileName     :       top_tb.v                                  
*       Abstract     :       This module is an example for coding.              
*       Author       :       Mouhongbing                                         
*       Version      :       1.1                                                
*       Release      :       2022.9.29                                   
*       Revision     :                                                          
*           Version Date        Author          Modification description        
*           1.0                 Mouhongbing      2022.9.29                
*                                                                               
******************************************************************************/ 
`timescale 1ns / 1ns

module top_tb;

//图像属性:图像宽度 图像高度 图像尺寸 图像像素点起始位
integer bmp_width;
integer bmp_high;
integer bmp_size;
integer start_index;

//bmp file id
integer bmp_file_id;
integer bmp_dout_id;
integer dout_txt_id;

//文件句柄
integer h;
//文件bmp文件数据
reg		[7:0]	rd_data  [0:49300];//根据自己图片大小

//写操作
reg		[23:0]	wr_data;
integer i = 0;
integer index;

initial
begin
    clk=1'b1;
	//打开原始图像
	bmp_file_id = $fopen("D:\\python\\pic\\lena.bmp","rb");
	//打开输出图像
	bmp_dout_id = $fopen("D:\\python\\pic\\output_file.bmp","wb");
	//打开输出数据
	dout_txt_id = $fopen("D:\\python\\pic\\output_file.txt","w+");

	//读取bmp文件
	h = $fread(rd_data,bmp_file_id);

    // 图像宽度
	bmp_width = {rd_data[21], rd_data[20], rd_data[19], rd_data[18]};
	// 图像宽度
	bmp_high = {rd_data[25], rd_data[24], rd_data[23], rd_data[22]};
	// 像素起始位置
	start_index = {rd_data[13], rd_data[12], rd_data[11], rd_data[10]};
	// 图像尺寸
	bmp_size = {rd_data[5], rd_data[4], rd_data[3], rd_data[2]};
	$fclose(bmp_file_id);



	//输出BMP
	for(i = 0; i < bmp_size; i = i + 1)begin
             $fwrite(bmp_dout_id, "%c", rd_data[i]);//注意参数%c
    end
    $fclose(bmp_dout_id);
    
    //输出txt,只存像素点
    for(index = start_index; index < bmp_size-2; index = index + 3)begin
        wr_data = {rd_data[index + 2], rd_data[index + 1], rd_data[index]};
        $fwrite(dout_txt_id, "%d,", wr_data[7:0]);
        $fwrite(dout_txt_id, "%d,", wr_data[15:8]);
        $fwrite(dout_txt_id, "%d\n", wr_data[23:16]);
    end
    $fclose(dout_txt_id);
end

endmodule

在这里插入图片描述

python处理代码(附)

图像转txt

import cv2     # h, w, c
import numpy
import matplotlib.pyplot as plt

img = cv2.imread("./pic/th.bmp" , 1)
print("图像的形状,返回一个图像的(行数,列数,通道数):", img.shape)
print("图像的像素数目:", img.size)
print("图像的数据类型:", img.dtype)
#img = cv2.resize(img,(280,280))    可以改变图片的大小

fname = open("./pic/th.txt",'w')
# fname.write("图像的形状,返回一个图像的(行数,列数,通道数):"+str(img.shape)+'\n')
# fname.write("图像的像素数目:"+str(img.size)+'\n')
# fname.write("图像的数据类型:"+str(img.dtype)+'\n')
Ylenth = img.shape[1]          # 图片列数
Xlenth = img.shape[0]          # 图片行数

for i in range(Xlenth):
    for j in range(Ylenth):
        fname.write(str(img[i][j][0])+','+str(img[i][j][1])+','+str(img[i][j][2])+'\n')
    # fname.write('\n')
fname.close()


cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

txt转bmp

# -*- coding:utf8 -
from PIL import Image
x = 128    #x坐标  通过对txt里的行数进行整数分解
y = 128  #y坐标  x*y=行数 13500行,150和900也可以
 
im = Image.new("RGB", (x,y))
file = open('./pic/output_file.txt')
 
for i in range(0,x):
    for j in range(0,y):
        #line = file.readline().replace('[','').replace(']','')  #获取一行rgb值,并且把()都替换为空
        line=file.readline()
        rgb = line.split(",") #逗号分割
        im.putpixel((i, j), (int(rgb[2]), int(rgb[1]), int(rgb[0]))) #(i,j)为坐标,后面的是像素点
file.close()
im.save("./pic/output_file.bmp")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA-仿真读写bmp图片 的相关文章

  • 如何编写嵌套的 __init__.py 文件

    我正在努力解决嵌套问题 init py在我正在编写的Python包中 该包具有以下架构 module init py submodule1 init py source py submodule2 init py source py sub
  • 从文本文件中删除特定字符

    我对 Python 和编码都很陌生 我当时正在做一个小项目 但遇到了一个问题 44 1 6 23 2 7 49 2 3 53 2 1 68 1 6 71 2 7 我只需要从每行中删除第三个和第六个字符 或者更具体地说 从整个文件中删除 字符
  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • Matplotlib:如何有效地将大量线段着色为独立渐变

    Python 绘图库 如何有效地将大量线段着色为独立渐变 已经 阅读this https stackoverflow com questions 8500700 how to plot a gradient color line in ma
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • 如何查找或安装适用于 Python 的主题 tkinter ttk

    过去 3 个月我一直在制作一个机器人 仅用代码就可以完美运行 现在我的下一个目标是为它制作一个 GUI 但是我发现了一些障碍 主要的一个是能够看起来不像一个 30 年前的程序 我使用的是 Windows 7 我仅使用 Python 3 3
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发

随机推荐

  • 临界区操作的原子性

    所谓的原子性就是操作在未执行完之前不会被打断 在多线程变成的时候 很多时候都会在线程函数中或者被线程调用的函数中使用临界区来实现函数操作的原子性 临界区保证当前进入临界区的线程能够完整执行完临界区中保护的代码不被打断 但是当时我一直对临界区
  • python:json格式化输出

    参考 https stackoverflow com questions 12943819 how to prettyprint a json file import json your json foo bar baz null 1 0
  • kibana启动失败no known master node, scheduling a retry或者master_not_discovered_exception

    今天在用到elasticsearch和kibana时遇到错误 主要就是这种报错master not discovered exception 找不到master节点 有两种解决方法 一种是安装elasticsearch使用 msi安装包的形
  • Android Studio更新Gradle版本

    Android Studio更新Gradle版本 1 在File分栏下 点击Project Structure 2 按照图示步骤操作 选中Project 点击Android Gradle Plugin Version复选框下三角符号 选择需
  • 2022.0306避障小车学习1

    要求 使用stm32f103单片机 应用RTOS实时系统 使用超声波模块 oled屏 l298n直流步进电机 驱动模块和小车底盘 思路 在任务里用超声波实时测出距障碍物的距离 并将距离显示在oled屏上 再根据判断距离大小调用前进或者后退那
  • web应用开发实战 - node.js

    了解Node js Node js 是一个基于 Chrome JavaScript 运行时建立的一个平台 Node js 是一个基于 Chrome V8 引擎的 JavaScript 运行时 Node js是运行在服务端上的 JavaScr
  • 单页面引入vue和element

    引入vue 1 可以直接在页面中引入 2 https cdn jsdelivr net npm vue 2 dist vue js 打开该链接下载vue 存放在本地 引入element 方法同上
  • 交换机的简单描述

    工作原理 1 交换机有张表 MAC地址表 一开始未通讯之前 MAC地址表是空的 2 同一个局域网中主机A访问主机B 3 主机A会将自己的MAC地址和对面的MAC地址封装进数据帧 自己的是源MAC地址 对面是目 的MAC地址 4 交换机会收到
  • [极客大挑战 2019]HardSQL 1

    极客大挑战 2019 HardSQL 1 首先打开题目 明显的发现这是一个sql注入的题 我们先用 和 测试是否有注入报错 发现用 时报错 所以这题很明显是有sql注入的 于是我们就利用用语句 admin or 1 1 测试得到 发现这里是
  • c++ 笔记1

    c 笔记 1 inline内联函数 2 构造函数初始化 3 构造函数重载注意事项 4 常量成员函数 5 参数传递和返回值使用const引用 6 友元 7 运算符重载this指针 8 规范化代码一 complex h complex test
  • jdbc连接mysql的语法_JDBC 连接MySQL实例详解

    JDBC连接MySQL JDBC连接MySQL 加载及注册JDBC驱动程序 Class forName com mysql jdbc Driver Class forName com mysql jdbc Driver newInstanc
  • 2021年中职组“网络安全”赛项 杭州市竞赛任务书

    2021年中职组 网络安全 赛项 杭州市竞赛任务书 一 竞赛时间 总计 360分钟 二 竞赛阶段 三 竞赛任务书内容 拓扑图 一 A模块基础设施设置 安全加固 200分 一 项目和任务描述 假定你是某企业的网络安全工程师 对于企业的服务器系
  • HashSet添加元素的过程

    文章目录 HashSet添加元素的过程 HashSet添加元素的过程 底层结构 数组 链表
  • MySQL数据库是非关系_关系型数据库和非关系型数据库的理解

    综合百度百科和自己的理解整理以下内容 便于日常用到时进行查找 如下 一 关系型数据库 1 含义 关系型数据库 是指采用了关系模型来组织数据的数据库 其以行和列的形式存储数据 以便于用户理解 关系型数据库这一系列的行和列被称为表 一组表组成了
  • pcb上模拟地和数字地怎么隔离

    p 谢谢了 学习中 p oh mygod Post at 2006 2 20 10 45 00 p 注意把数字地隔离 p p 直接打到主地或者单点接地 p br
  • SSL/TLS一键配置工具-IISCrypto

    IIS Crypto 是一个免费工具 使管理员能够在 Windows Server 2008 2012 2016 2019 和 2022 上启用或禁用协议 密码 哈希和密钥交换算法 允许您重新排序 IIS 提供的 SSL TLS 密码套件
  • C++ 知识点/面试题目总结 (八股文)

    C 知识点 面试题目总结 八股文 1 C和C 的区别 2 构造函数后面的冒号有什么用 3 函数后面 default和 delete有什么用 4 类的大小和什么有关系 5 struct和typedef struct什么区别 6 函数后面加co
  • 【数据结构与算法学习】图的深度优先遍历(DFS算法)

    目录 一 什么是图的遍历 二 深度优先遍历 DFS 的基本思想 三 深度优先遍历 DFS 的步骤详解 四 深度优先遍历 DFS 的代码实现 一 什么是图的遍历 图的遍历 指的是从图中的任一顶点出发 对图中的所有顶点访问一次且只访问一次 图的
  • 洛谷P1088火星人(C++)

    导语 这篇题解 如果你是不知道什么是全排列 的童鞋 自己去小墙角面壁思过5秒钟 不是 是让你按照以下顺序食用题解 题目 gt 全排列函数 纯手码写法 gt 思路 gt 全排列函数 next permutation gt AC代码 gt 总结
  • FPGA-仿真读写bmp图片

    文章目录 位图说明 位图 Verilog代码实现 python处理代码 附 最近想完成FPGA图像处理 由于没有开发板 就像通过仿真完成 之前像的是通过python 将图像转化为txt文本 最后利用verilog 读取txt文件导入 对像素