最近准备做视频接口方面的开发,为了更加直观的看到一些图像的处理效果,前期先搭建一下简单的图像测试平台是十分有必要的,说到测试我还是比较喜欢使用强大的数学工具matlab,话不多说,目前我的验证测试思路如图:
本文主要的内容集中在matlab这块,需要实现的功能或者工作是,
1,首先用matlab将彩色图像的像素数据以16进制的方式写进mif或者txt文件。
为什么是16进制呢?因为我想将彩色图像的3个像素层都写到一个txt当中,所有数据宽度为3个像素,深度为图像分辨率row*col的数据形式,方便verilog仿真读取。同时为了防止数据错乱,所以使用16进制。对于16进制写文件的方式(如图)可以始终保持一行数据是6位,其中每个像素(8bit)是2位16进制数,这样在verilg读的时候只需要一行一行的读,然后将读出的每一行数据位宽简单的划分([23:16][15:8][7:0])就可以获得每层自己的像素数据。
2,matlab读取txt文件数据
当FPGA处理完之后,需要观察图像处理的结果,就需要将FPGA输出的TXT通过Matlab读取数据,然后还原成彩色图像,整个流程就结束了。下面是源代码;
close all
clear all
% //////////////////////////////////读取图像显示///////////////////////////////////////
img=imread('2.jpg'); %可读取jpg、jpeg、bmp等图片格式
subplot(1,2,1);
imshow(img); % 显示原始图片
title('原始图像');
%////////////////////////////////////////读取图层///////////////////////////////////////
I1=img(:,:,1);
I11=I1(:); %转换为一列
I2=img(:,:,2);
I22=I2(:); %转换为一列
I3=img(:,:,3);
I33=I3(:); %转换为一列
%/////////////////////////////////////将图片信息写入.mif文件/////////////////////////////
img_gary = rgb2gray(img); % 转成灰度图
[row,col]=size(img_gary);
img_size=row*col; %提取图片大小
fid=fopen('picture_data.mif','W' ); % 打开.mif文件向里面写数据,如果还没有建立这个文件,会自动建立之后打开
fprintf(fid,'WIDTH=8;\n'); % 像素宽度为8位(灰度值是0-255,8位的数据)
fprintf(fid,'DEPTH=%d;\n\n',img_size); % 像素的深度(row*col的图片)
fprintf(fid,'ADDRESS_RADIX=UNS;\n');% 地址数据为无符号数(unsigned)
fprintf(fid,'DATA_RADIX=UNS;\n\n'); % 像素数据也是无符号数
fprintf(fid,'CONTENT BEGIN\n');
for x = 1:img_size % row*col个数据
fprintf(fid,'%d:%d;\n',x-1,img_gary(x)); % 写入数据
end
fprintf(fid,'END;'); % 文件结束
fclose(fid); % 关闭文件
%////////////////////////////将图片信息写入txte文件//////////////////////////////////////
fid_Wtxt=fopen('picture_data.txt','w' );
for i=1:img_size
fprintf(fid_Wtxt,'%02x%02x%02x\n',I11(i),I22(i),I33(i)); %以十六进制写入txt
% fprintf(fid_txt,'%d%d%d:\n',I11(i),I22(i),I33(i)); %以十进制写入txt
end
fclose(fid_Wtxt);
%////////////////////////////将图片信息读出txte文件//////////////////////////////////////
fid_Rtxt=fopen('picture_data.txt' ,'r'); %数据可来自于FPGA仿真
picture_data=fscanf(fid_Rtxt,'%02x'); %以十进制读出txt
% % fprintf(fid_txt,'%d%d%d:\n',I11(i),I22(i),I33(i)); %以十进制写入txt
fclose(fid_Rtxt);
%//////////////////////////////////还原到图层////////////////////////////////////////////
for i=1:img_size
picture_data1(i)=picture_data(1+(i-1)*3);
end
picture_I1=reshape(picture_data1,[row,col]);%第一个图层
for i=1:img_size
picture_data2(i)=picture_data(2+(i-1)*3);
end
picture_I2=reshape(picture_data2,[row,col]);%第二个图层
for i=1:img_size
picture_data3(i)=picture_data(3+(i-1)*3);
end
picture_I3=reshape(picture_data3,[row,col]);%第三个图层
%//////////////////////////////还原彩色显示图像////////////////////////////////////////
img_txt=[];
img_txt(:,:,1)=picture_I1;
img_txt(:,:,2)=picture_I2;
img_txt(:,:,3)=picture_I3;
img_txt=uint8(img_txt);
subplot(1,2,2);
imshow(img_txt);
title('txt复原图像')
代码部分都有相应的解释,主要还是通过imread函数和fopen等函数的调用完成txt文本的读写,最后测试的结果图像如下.
本文主要参考的博客: