本次学习的内容主要是modelsim波形中数据导出到txt文档,以及matlab的文本文件与图像间的转化方法。
—————————————————————————————————
因为在使用FPGA进行图像处理的时候需要进行图像显示,在手边没有显示屏的情况下,可以将modelsim仿真wave中的数据变量导出到txt文档,然后将txt文档导入到matlab中进行图片的显示。
a=imread('2.bmp'); %读入图片
b=rgb2gray(a); %由rgb图片转化为灰度图
c=b'; %matlab图片转换为矩阵是一列一列转的,最终图像是行为单位,转置
fid0=fopen('data.txt','wt'); % 创建并打开一个名为data.txt的文件,可写
fprintf(fid0,'%x\n',c); %把灰度图矩阵b以16进制写入data.txt文件,没写入一个元素换一行
fclose(fid0); %关闭保存该data.txt文件
%==========================================================================
% 彩色图片转为txt文本,格式为24bit的hex数据
%==========================================================================
clc;
clear all;
%--------------------------------------------------------------------------
pre_img = imread('pre_img.jpg'); %读取图片文件
[ROW,COL,N] = size(pre_img); %获得图片尺寸[高度,宽度,维度]
RGB_ij = uint64(zeros(ROW,COL)); %定义32位宽的RGB变量
%--------------------------------------------------------------------------
fid = fopen('pre_img.txt','w'); %打开txt文档
for i = 1:ROW
for j = 1:COL
R = double(pre_img(i,j,1));
G = double(pre_img(i,j,2));
B = double(pre_img(i,j,3));
%-------------------------------------
RGB = R*(2^16) + G*(2^8) + B;
RGB_ij(i,j) = RGB;
RGB_hex = dec2hex(RGB);
%-------------------------------------
fprintf(fid,'%s\n',RGB_hex); %将字符打印到txt文档中
end
end
fclose(fid);
%--------------------------------------------------------------------------
imshow(pre_img),title('处理前的图片'); %查看处理前的图片
读入图像并进行hex文件转换,注意图像尺寸要相同。
b=imread('100.bmp'); % 24-bit BMP image RGB888
k=1;
for i=100:-1:1 % 图像尺寸
for j=1:100
a(k)=b(i,j,1);
a(k+1)=b(i,j,2);
a(k+2)=b(i,j,3);
k=k+3;
end
end
fid = fopen('kodim100.hex', 'wt');
fprintf(fid, '%x\n', a);
disp('Text file write done');disp(' ');
fclose(fid);
fid0=fopen('data.txt','r'); %读入所需要的txt文件
[a,count]=fscanf(fid0,'%x'); %a为data.txt文件数据读入的矩阵,以16进制形式,count为该矩阵元素个数
b=reshape(a,100,100); % 构建成100*100的矩阵形式
c=b'; % 需要再转置一次方为图片行列方向的矩阵
imshow(c,[]); %显示图片
参考:
https://blog.csdn.net/weiweiliulu/article/details/51443286
在verilog程序中添加相对应的代码即可(在tb测试文件中添加)
//如下想要将120*120图像大小的14400个数据导出
always @ (posedge clk)
begin
if (!rst_n)
i <=0;
else if (i<2501)
i <= i+1;
else
i<= 2501;
end
integer w_file;
initial w_file = $fopen("data_out_1.txt");
always @(i)
begin
$fdisplay(w_file,"%d",rom_data); //十进制的输出
if(i == 15'd2500) ; //共写入2500个数据
end
说明:
- 如何用上面的方法来对 FPGA实现图像裁剪后的图像进行显示
首先FPGA实现图像裁剪,裁剪最重要的就是 通过给定的边界信息来确定区域,然后将在这个区域内的图像输出。
原始的图像是120*120,裁剪成 50 * 50的图片,并显示出来。
计算好要输出的数据,后在tb文件中加入上面所描述的代码,即可将modelsim波形中要我们所需要的数据导出到 txt 文档中。
通过matlab将txt文件读入,并进行显示即可。
fid0=fopen('data.txt','r'); %读入所需要的txt文件
[a,count]=fscanf(fid0,'%x'); %a为data.txt文件数据读入的矩阵,以16进制形式,count为该矩阵元素个数
b=reshape(a,100,100); % 构建成100*100的矩阵形式
c=b'; % 需要再转置一次方为图片行列方向的矩阵
imshow(c,[]); %显示图片
出现此错误的原因是:数据量与显示的图像大小不对应。因为此时txt文件中有2500的数据,那么就是50*50的图像大小,因此进行修改:可成功运行
b=reshape(a,50,50);
clear all
close all
image_1 = imread('2.bmp'); % 读取图片
figure;
fid=fopen('2.mif','W' ); % 打开2.mif文件向里面写数据,如果还没有建立这个文件,会自动建立之后打开
fprintf(fid,'WIDTH=8;\n'); % 数据宽度为8位(灰度值是0-255,8位的数据)
fprintf(fid,'DEPTH=65536;\n\n'); % 数据的深度(256*256的图片,65536个数据)
fprintf(fid,'ADDRESS_RADIX=UNS;\n');% 地址数据为无符号数(unsigned)
fprintf(fid,'DATA_RADIX=UNS;\n\n'); % 像素数据也是无符号数
fprintf(fid,'CONTENT BEGIN\n');
for x = 1:65536 % 65536个数据
fprintf(fid,'%d:%d;\n',x-1,image_1(x)); % 写入数据
end
fprintf(fid,'END;'); % 文件结束
fclose(fid); % 关闭文件
参考:https://blog.csdn.net/DengFengLai123/article/details/106538254