利用MATLAB将图片转换成coe文件、TXT文件、mif文件

利用MATLAB将图片转换成coe文件

首先,MATLAB是特别强大的数学工具,如果不会MATLAB那么自己的整个职业生涯只能写写接口逻辑,与算法再无关联,很难有长久的进步,所以这里我们将给出几个MATLAB的例子。
我们为什么要将一幅图片转换成coe图片,因为在ISE软件中,我们可以发现ROM中预存的信息格式是coe文件,所以我们要想在ROM存储相应的信息,必须先把文件转换成coe文件。相信同学们也都明白该操作的意义,所以我们这里直接给出代码以供学习交流。

// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : 
// Module Name  : fig.coe
// Create Time  : 2020-02-07 15:26:28
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

clc;
clear all;
RGB=imread('logo.jpg');
R=RGB(:,:,1);
G=RGB(:,:,2);
B=RGB(:,:,3);
outdata=zeros(1,40000);
for r = 1:200
	for c = 1:200
		outdata((r-1)*200+c)=bitand(R(r,c),224)+bitshift(bitand(G(r,c),224),-3)+bitshift(bitand(B(r,c),192),-6);
	end
end	
fid=fopen('data.coe','w+');
fprintf(fid,'memory_initialization_radix=16;\nmemory_initialization_vector=\n');
for i = 1:39999
	fprintf(fid,'%x,\n',outdata(i));
end
fprintf(fid,'%x;',outdata(40000));
fclose(fid);
		

利用MATLAB将图片转换成txt文件

这里也说明一下这样做的原因,例如我们要经过串口发送一幅图片数据时,我们不能直接用UE打开图片,然后将UE中的信息发送出去,因为学过图像处理的同学都应该知道,对于bmp真彩图,图片中含有文件头和信息头与图片信息,对于索引图像更是有索引表,对于常见的jpg压缩图像更使与图片信息没有直接关系。所以我们要利用MATLAB将图片信息提取到txt文件中。弄清楚了该过程的意义之后,我们给出转换的代码如下:

// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : 
// Module Name  : fig.txt
// Create Time  : 2020-02-07 15:26:28
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

clear all;          %清空所有变量
clc;                %
pic_data    = imread('./800x600a.jpg');    %R:8bit
pic_red     = pic_data(:,:,1);
pic_green   = pic_data(:,:,2);
pic_blue    = pic_data(:,:,3);
[ROW COL]   = size(pic_red);


% 对原图进行处理,将处理完的图像数据写入abc.txt文件
fid = fopen('./abcde800x600a.txt','w+');
for r = 1: ROW
    for c = 1:COL
        %red取高3位,green取高3位,blue取高2位,拼成8% 串口,一帧数据:8bit,原始图像一个像素点占24bit
        pic_out(r,c) = bitand(pic_red(r,c), 224) + bitshift(bitand(pic_green(r,c),224),-3)+ bitshift(bitand(pic_blue(r,c),192),-6);    
        fprintf(fid,'%02x ',pic_out(r,c));
    end
end
fclose(fid);

利用MATLAB将图片转换成mif文件

intel FPGA中ROM文件中存储的时mif文件,与Xilinx中相同,想将图片信息存储到FPGA的ROM中,必须先将图片信息转存成mif文件,这里也不过说直接给出相应的代码供同学们理解:

// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : 
// Module Name  : fig.mif
// Create Time  : 2020-02-07 15:26:28
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************
function miffile(filename,var,width,depth)
if(nargin~=4) %% be tired to do more inupts check!
    error('Need 4 parameters! Use help miffile for help!');
end, 
    
fh=fopen(filename,'w+');
fprintf(fh,'--Created by zhangningning.\r\n');
fprintf(fh,'[email protected].\r\n');
fprintf(fh,'--%s.\r\n',datestr(now));
fprintf(fh,'WIDTH=%d;\r\n',width);
fprintf(fh,'DEPTH=%d;\r\n',depth);
fprintf(fh,'ADDRESS_RADIX=HEX;\r\n');
fprintf(fh,'DATA_RADIX=HEX;\r\n');
fprintf(fh,'CONTENT BEGIN\r\n');

var=rem(var,2^width);%% clip to fit the width;
[sx,sy,sz]=size(var);%% can only fit 3D or less;
value=var(1,1,1);
sametotal=1;
idepth=0;
addrlen=1;
temp=16;
while(temp<depth) %%decide the length of addr
       temp=temp*16;
       addrlen=addrlen+1;
end,
datalen=1;
while(temp<width) %%decide the length of data
       temp=temp*16;
       datalen=datalen+1;
end,
for k=1:sz,
    for j=1:sy,
        for i=1:sx,
            if(~((i==1 ) &&( j==1) &&( k==1)))
               if(idepth<depth),
                  idepth=idepth+1;
                if(value==var(i,j,k))
                    sametotal=sametotal+1;
                    continue;
                else
                    
                        if(sametotal==1)
                           fprintf(fh,['\t%' num2str(addrlen) 'X:%' num2str(datalen) 'X;\r\n'],idepth-1,value);
                        else
                           fprintf(fh,['\t[%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;\r\n'],idepth-sametotal,idepth-1,value);
                        end,
                       sametotal=1;
                       value=var(i,j,k);
                end,
                    else
                 break;
                
                end,
            end,
        end,
    end,
end,
if(idepth<depth)
             if(sametotal==1)
               fprintf(fh,['\t%' num2str(addrlen) 'X:%' num2str(datalen) 'X;\r\n'],idepth,value);
              else
                 fprintf(fh,['\t[%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;\r\n'],idepth-sametotal+1,idepth,value);
              end,
end,
if(idepth<depth-1)
    if(idepth==(depth-2))
        fprintf(fh,['\t%' num2str(addrlen) 'X:%' num2str(datalen) 'X;\r\n'],idepth+1,0);
    else
        fprintf(fh,['\t[%' num2str(addrlen) 'X..%' num2str(addrlen) 'X]:%' num2str(datalen) 'X;\r\n'],idepth+1,depth-1,0);
    end,
end,

fprintf(fh,'END;\r\n');                
fclose(fh);

这里为了不同从给出了一个通用性比较高的代码,当然也可以像写coe文件那样简单的写一个MATLAB文件。

总结

创作不易,认为文章有帮助的同学们可以收藏点赞支持。(工程也都在群中)对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

发布了23 篇原创文章 · 获赞 9 · 访问量 5395

猜你喜欢

转载自blog.csdn.net/zhangningning1996/article/details/104210502