文章目录

matlab中文本文件与图像间的转化

前言

本次学习的内容主要是modelsim波形中数据导出到txt文档,以及matlab的文本文件与图像间的转化方法。
—————————————————————————————————
因为在使用FPGA进行图像处理的时候需要进行图像显示,在手边没有显示屏的情况下,可以将modelsim仿真wave中的数据变量导出到txt文档,然后将txt文档导入到matlab中进行图片的显示。

1、用Matlab实现图像格式转换

1.1 matlab将灰度图片转换成txt文档

  • 准备一个图片(注意格式和图片大小)

  • 编写程序
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文件             
                        
     

1.2 matlab将彩色图片转换成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('处理前的图片');      %查看处理前的图片

1.3 matlab将图片转换成hex文件

读入图像并进行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);

2、txt文档通过matlab进行图片显示

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,[]);    %显示图片    

3、modelsim仿真wave中数据变量导出到txt文档

参考:

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    

说明:

  • rom_data 是存储在ROM中的数据。
  • 若操作后发现txt 一直没有数据,检查代码也没错,可尝试把modelsim仿真软件关闭后,数据能存入到 txt 文件里。

4、应用

- 如何用上面的方法来对 FPGA实现图像裁剪后的图像进行显示

  • 首先FPGA实现图像裁剪,裁剪最重要的就是 通过给定的边界信息来确定区域,然后将在这个区域内的图像输出。

  • 原始的图像是120_120,裁剪成 50 _ 50的图片,并显示出来。

  • 计算好要输出的数据,后在tb文件中加入上面所描述的代码,即可将modelsim波形中要我们所需要的数据导出到 txt 文档中。

  • 通过matlab将txt文件读入,并进行显示即可。

4.1 纠错

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); 

4.2 没有显示屏也能显示图片

  • modelsim波形中的数据导出到txt文档;
  • 用matlab实现文本文件与图像间的转化;
  • 通过这两步即可应对手边没有显示屏的困扰。

5、matlab将图片转换成mif文件

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