MATLAB将彩色图片像素数据以10进制写入.mif文件,并且可以通过16进制方式读写TXT文件。

本文介绍如何使用Matlab进行图像处理,并通过十六进制格式与FPGA交互。主要内容包括将彩色图像数据以十六进制形式写入TXT文件,以及从TXT文件中读取数据并还原为图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近准备做视频接口方面的开发,为了更加直观的看到一些图像的处理效果,前期先搭建一下简单的图像测试平台是十分有必要的,说到测试我还是比较喜欢使用强大的数学工具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文本的读写,最后测试的结果图像如下.

 本文主要参考的博客:

http://t.csdn.cn/kVtRU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值