NES文件利用MATLAB可视化

简介:

NES是Nintendo Entertainment System的缩写,记录了NES小游戏的所有代码和数据。像超级玛丽、忍者龙剑传、热血格斗、007等游戏都有精彩纷呈的背景图片和形象生动的人物造型,我们是否能提取出这些素材,经过加工,用于其他UI设计呢?今天我们用MATLAB研究下具体内容。


NES文件结构分为3大部分:文件头、CPU代码区、PPU数据区。通过文件头可以获得代码区、数据区的大小。这里只需要数据区。


数据区组织为4KB大小的数据块,填充在PPU地址区间0x0000~0x1000(或者0x1000~0x2000),称为Pattern Table,其实就是一个个8x8的点阵数据,用户程序写入Name Table、SPR-RAM中相应的索引就能实现在屏幕指定位置上描绘相应的点阵信息,组合多个点阵可以实现复杂背景和人物造型的显示。这里只将原始点阵描出。代码如下:


clear;
clc;
close all;


path = './rom/';
[nes_file_name, path, filterindex] = uigetfile('*.nes', 'Pick an NES file',path);%选择NES文件
fid = fopen(fullfile(path,nes_file_name),'rb');
rawdata = fread(fid,'uint8');
fclose(fid);
len_header = 16;<span style="white-space:pre">	</span>%文件头,16Bytes
len_pgm = 1024*16;      %16KB
len_ppu = 1024*8;       %8KB
header = rawdata(1:len_header);

if and(and(and((header(1) == uint8('N')),header(2) == uint8('E')),header(3) == uint8('S')),header(4) == 26)
    fprintf('NES File Loaded...\n');
else
    fprintf('Not an NES File!\n');
    return;
end
num_pgm = header(5);
num_ppu = header(6);
pgm = rawdata(len_header + (1:len_pgm));


for ppu_idx = 1:num_ppu
ppu = rawdata(len_header + len_pgm * num_pgm + (ppu_idx - 1) * len_ppu + (1:len_ppu));

ppu1 = ppu(0 + (1:len_ppu/2));          % 4KB
ppu2 = ppu(len_ppu/2 + (1:len_ppu/2));  % 4KB
ppu1 = reshape(ppu1,16,[]);
ppu2 = reshape(ppu2,16,[]);

showimag1 = zeros(128,128);
showimag2 = zeros(128,128);
and_matrix = ones(8,1)*2.^(7:-1:0);
zz1 = zeros(8,8);
zz2 = zeros(8,8);
for k = 1:size(ppu1,2)
    x = mod(k-1,16);
    y = floor((k-1)/16);
    rdata1l = logical(bitand(ppu1(1:8,k)*ones(1,8),and_matrix));
    rdata1h = logical(bitand(ppu1(9:16,k)*ones(1,8),and_matrix));
    rdata2l = logical(bitand(ppu2(1:8,k)*ones(1,8),and_matrix));
    rdata2h = logical(bitand(ppu2(9:16,k)*ones(1,8),and_matrix));
    zz1 = rdata1l + rdata1h * 2;
    zz2 = rdata2l + rdata2h * 2;
    showimag1((y)*8 + (1:8), (x)*8 + (1:8)) = zz1 * 64;
    showimag2((y)*8 + (1:8), (x)*8 + (1:8)) = zz2 * 64;
end

figure;subplot(121);imshow(uint8(showimag1));title('Pattern Table #1');
subplot(122);imshow(uint8(showimag2));title('Pattern Table #2');
end

下面欣赏几幅游戏中提取出来的Pattern Table











目录
相关文章
matlab读取csv文件csvread()
matlab读取csv文件csvread()
|
3月前
|
存储 缓存 算法
基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证
|
2月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
6天前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
9天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
14天前
|
算法 计算机视觉 异构计算
基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
该内容展示了FPGA实现图像累积直方图的算法。使用Vivado2019.2和matlab2022a,通过FPGA的并行处理能力优化图像处理。算法基于像素值累加分布,计算图像中像素值小于等于特定值的像素个数。核心代码为`test_image`模块,读取二进制图像文件并传递给`im_hist`单元,生成直方图和累积直方图。
|
23天前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。
|
1月前
|
存储 人工智能 机器人
【Matlab】Matlab 汉/英语(A/a)声学特征比较与基音频率分析(源码+音频文件)【独一无二】
【Matlab】Matlab 汉/英语(A/a)声学特征比较与基音频率分析(源码+音频文件)【独一无二】
|
2月前
|
编解码 算法 计算机视觉
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
|
3月前
|
算法 自动驾驶 计算机视觉
基于FPGA的图像Robert变换实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像Robert变换实现,包括tb测试文件和MATLAB辅助验证

热门文章

最新文章