用MATLAB 读写各种文件 ∈ Matlab 使用笔记
主博客:https://blog.csdn.net/Gou_Hailong/article/details/106092705
【日志】
2020/6/15
早就想開這個(gè)博客了,一直沒有用到 Matlab 讀文件,這不最近要用 Matlab 讀取 txt 文件,就先把這部分介紹一下。
2020/8/19
加了讀文本文件的例子,將文章結(jié)構(gòu)優(yōu)化了一下,加了讀取圖片的方法。
2020/8/20
加了寫圖片文件,nc,excle。
2020/10/29
加入了一個(gè)讀寫geotiff的例子。
2020/11/1
加了一個(gè)txt存文件名,之后讀txt的例子。
一、讀寫文本文件
以 txt 為例
1.讀
常用的主要有以下幾種方法:
1.load /*1.該函數(shù)只能加載僅含有數(shù)字的文本文件,如果文檔中夾雜著字母或者文字,就會(huì)報(bào)錯(cuò)。 2.支持的分割符有 “,”、“,”、“ ”、“ ”... 3.每行列數(shù)必須相等 4.Data 是一個(gè)矩陣*/ Data = load("filename.txt");2.importdata /*1.既可以讀取數(shù)據(jù)又可以讀取字符: Data.data矩陣?yán)锎娣诺氖羌償?shù)字, Data.textdata矩陣?yán)锸且晕谋拘问酱娣诺乃袛?shù)據(jù)。 2.支持的分割符有 “ ”、“ ”... 3.個(gè)人感覺不太好用*/ Data = importdata("filename.txt");3.textread /*它的基本語(yǔ)法是: [A,B,C,...] = textread(filename,format) [A,B,C,...] = textread(filename,format,N) 其中filename就是文件名, format就是要讀取的格式,A,B,C就是從文件中讀取到的數(shù)據(jù)。 中括號(hào)里面變量的個(gè)數(shù)必須和format中定義的個(gè)數(shù)相同。 如果每N行相同格式的數(shù)據(jù),可采用[A,B,C,...] = textread(filename,format,N)的語(yǔ)法,讀取N次。 詳細(xì)介紹如下博客鏈接*/textread(filename,'%s%f-%f-%f%f:%f%f',... %文件名用' ' ,格式 'headerlines',1,... %忽略前1行'delimiter' ,';'); %分隔符為;textread用法示例:https://blog.csdn.net/jisuanjiguoba/article/details/79997805
補(bǔ)于2021-03-14
下面是一個(gè)函數(shù),用來(lái)讀取空格分割的文本文件,將數(shù)據(jù)存到元胞數(shù)組中,但是太耗時(shí),廢棄不用,還是textread香啊!
2.寫
將數(shù)據(jù)寫入 txt 需要用到 fopen、fprintf 函數(shù),這就有點(diǎn)像C、C#了。
FID = fopen(FILENAME,PERMISSION) /*FID 獲取到的文件句柄 FILENAME 文件名 PERMISSION 打開方式*/fprintf(fid,format,A) /*fid為文件句柄,指定要寫入數(shù)據(jù)的文件, format是用來(lái)控制所寫數(shù)據(jù)格式的格式符,與fscanf函數(shù)相同, A是用來(lái)存放數(shù)據(jù)的矩陣。*/help('fopen') help('fprintf') doc fopen doc fprintf /*上面介紹的比較簡(jiǎn)單 更詳細(xì)的介紹可以通過(guò)這些命令查看*/3.例子
例子1:這個(gè)例子是讀寫文本文件里邊存著數(shù)據(jù)的那類。
先寫一下:
這個(gè)例子說(shuō)明了:matlab 寫文件是按照列來(lái)存取數(shù)據(jù)的,為了后續(xù)讀,把后面幾行刪了
讀:
[R,Area]= textread('draft.txt','%3d %11.4f',... %文件名用' ' ,格式 'headerlines',1,... %忽略前1行'delimiter' ,' '); %分隔符為; type draft.txt %在命令窗口查看txt這步得到倆列向量。
例子2:有時(shí)候由于批量操作某些文件,但是文件名字規(guī)律性不是很強(qiáng),所以就需要將文件名字存到一個(gè)文本文檔里邊,然后讀這個(gè)文件來(lái)獲得文件名,這個(gè)例子是針對(duì)這種類型的。
soupath='D:\matlab\mat\CHLA\sorce\'; %source year=[2010 2005 2020 2015];% soufilename=[soupath,'filename.txt']; filename=textread(soufilename,'%s'); %將txt中的數(shù)據(jù)搞成元胞filename count=-1; for i=yearcount=count+1;for j=1:3str1=char(filename(count*4+j)); %注意這行,是將元胞轉(zhuǎn)化為字符串。soufile=[soupath,str1,'.mat'];disp(soufile);end end結(jié)果如下:
D:\matlab\mat\CHLA\sorce\chla_201001.mat D:\matlab\mat\CHLA\sorce\chla_201002.mat D:\matlab\mat\CHLA\sorce\chla_201003.mat D:\matlab\mat\CHLA\sorce\chla_201501.mat D:\matlab\mat\CHLA\sorce\chla_201502.mat D:\matlab\mat\CHLA\sorce\chla_201503.mat D:\matlab\mat\CHLA\sorce\chla_202001.mat D:\matlab\mat\CHLA\sorce\chla_202002.mat D:\matlab\mat\CHLA\sorce\chla_202003.mat D:\matlab\mat\CHLA\sorce\chla_202501.mat D:\matlab\mat\CHLA\sorce\chla_202502.mat D:\matlab\mat\CHLA\sorce\chla_202503.mat二、讀寫圖片
Matlab用來(lái)讀取圖像的函數(shù)是imread(),顧名思義image read,同樣的道理寫圖片的函數(shù)是imwrite();
圖片的格式有(我去,竟然有那么多種圖片格式,看來(lái)我是孤陋寡聞了)見于百度百科。常見的幾種有:jpg, bmp, gif, tif, png等,其中幾種簡(jiǎn)介如下:
| BMP格式 | Windows系統(tǒng)下的標(biāo)準(zhǔn)位圖格式,未經(jīng)過(guò)壓縮,一般圖像文件會(huì)比較大。在很多軟件中被廣泛應(yīng)用. |
| JPEG格式 | 也是應(yīng)用最廣泛的圖片格式之一,它采用一種特殊的有損壓縮算法,將不易被人眼察覺的圖像顏色刪除,從而達(dá)到較大的壓縮比(可達(dá)到2:1甚至40:1),因?yàn)镴PEG格式的文件尺寸較小,下載速度快,所以是互聯(lián)網(wǎng)上最廣泛使用的格式! |
| GIF格式 | 最大的特點(diǎn)是不僅可以是一張靜止的圖片,也可以是動(dòng)畫,并且支持透明背景圖像,適用于多種操作系統(tǒng),“體型”很小,網(wǎng)上很多小動(dòng)畫都是GIF格式。但是其色域不太廣,只支持256種顏色. |
| PSD格式 | Photoshop的專用圖像格式,可以保存圖片的完整信息,土層,通道,文字都可以被保存,圖像文件一般較大。 |
| PNG格式 | 與JPG格式類似,網(wǎng)頁(yè)中有很多圖片都是這種格式,壓縮比高于GIF,支持圖像透明,可以利用Alpha通道調(diào)節(jié)圖像的透明度,是網(wǎng)頁(yè)三劍客之一Fireworks的源文件。 |
| TIFF格式 | 它的特點(diǎn)是圖像格式復(fù)雜、存貯信息多,在Mac中廣泛使用的圖像格式,正因?yàn)樗鎯?chǔ)的圖像細(xì)微層次的信息非常多,圖像的質(zhì)量也得以提高,故而非常有利于原稿的復(fù)制。很多地方將TIFF格式用于印刷. |
| TGA格式 | TGA的結(jié)構(gòu)比較簡(jiǎn)單,屬于一種圖形、圖像數(shù)據(jù)的通用格式,在多媒體領(lǐng)域有著很大影響,在做影視編輯時(shí)經(jīng)常使用,例如3DS MAX輸出TGA圖片序列導(dǎo)入到AE里面進(jìn)行后期編輯。 |
| EPS格式 | 蘋果Mac機(jī)的用戶則用得較多。它是用PostScript語(yǔ)言描述的一種ASCII碼文件格式,主要用于排版、打印等輸出工作。 |
1.讀
Photo=imread(photofilenme);%讀的話,這一行就搞定了 Tif=imread('1.tiff'); %例子下面介紹一下我做的實(shí)驗(yàn):
- 我先用畫圖 3D 搞了幾種格式(tif, jpg, bmp, png)的圖片,圖片內(nèi)容都是下圖:
然后,用 imread() 讀取圖片,都得到了91x317x3 uint8這樣一個(gè)三維矩陣,之后又用 imshow() 顯示圖片,看到結(jié)果都是一樣的。但是,得到的三維矩陣并不是完全相同的,我覺得可能是圖片壓縮方式不同導(dǎo)致的。至于為啥是三維的,很容易猜到,91x317x3對(duì)應(yīng)行x列x頁(yè),即寬x長(zhǎng)xRGB - 從網(wǎng)上找了個(gè) gif, 看看這個(gè)gif一共有71幀,用 imread() 讀取圖片,得到了298x395x1x71這樣一個(gè)四維矩陣,之后又用 imshow() 顯示圖片,Info=imfinfo('1.gif'); 可查詢圖片信息。為啥第三維不是RGB呢?我曉得了,先看一下Info:前面是一大堆其他信息,包括路徑,時(shí)間等等。后面這有兩列,一個(gè)是位深,一個(gè)是colortable,25=322^5=3225=32,想必你已經(jīng)會(huì)了吧。顯示第一幀的代碼如下:
- 總之,imread()非常之強(qiáng)大!!
總結(jié):
mat=imread(filepath);%將圖片讀到矩陣mat中 Info=imfinfo(filepath);%查看圖片信息。 imshow(mat);%顯示圖片 img=cat(3,Rimg,Gimg,Bimg);%將三個(gè)二維矩陣合成一個(gè)三維矩陣 Rimg(mat==i)=colortable(j,1);%找到mat中等于i的元素位置,然后Rimg相應(yīng)位置填充元素colortable(j,1)這里提供一個(gè)小函數(shù),用來(lái)根據(jù)二維矩陣(整數(shù))和colortable 來(lái)畫圖。
function showgif(mat,colortable) bit=size(colortable,1); [a,b]=size(mat); Rimg=zeros(a,b); Gimg=zeros(a,b); Bimg=zeros(a,b); for i=0:bit-1j=i+1;%由于mat是從0-31, so...Rimg(mat==i)=colortable(j,1);%找到mat中等于i的元素位置,然后Rimg相應(yīng)位置填充元素colortable(j,1)Gimg(mat==i)=colortable(j,2);Bimg(mat==i)=colortable(j,3); end img=cat(3,Rimg,Gimg,Bimg);%將三個(gè)二維矩陣合成一個(gè)三維矩陣 imshow(img); end如果要讀的tif有好幾頁(yè)圖片,可用
Image=zeros(Height,Width,Slice); for i=1:SliceImage(:,:,i)=imread(filepath,i); %%一層一層的讀入圖像 end更多顯示圖片的方法:https://blog.csdn.net/Gou_Hailong/article/details/107619919
2.寫
1.寫簡(jiǎn)單tif, png, jpg, bmp
imwrite(Tif,[num2str(1,'%04d'),'.tif']); imwrite(Tif,[num2str(1,'%04d'),'.png']); imwrite(Tif,[num2str(1,'%04d'),'.jpg']); imwrite(Tif,[num2str(1,'%04d'),'.bmp']);2.寫gif,這里提供一個(gè)例子(來(lái)源于百度經(jīng)驗(yàn))
clear;clc; figure %新建一張圖 axis([0 5 0 2])%定義x軸(從0到5)和y軸的范圍(從0到2) for i=1:4if i==1text(i,1,'百','fontsize',40,'color','red');%i=1時(shí),寫一個(gè)‘百’字endif i==2text(i,1,'度','fontsize',40,'color','green');%i=2時(shí),寫一個(gè)‘度’字endif i==3text(i,1,'經(jīng)','fontsize',40,'color','blue'); %i=3時(shí),寫一個(gè)‘經(jīng)’字endif i==4text(i,1,'驗(yàn)','fontsize',40,'color','black');%i=4時(shí),寫一個(gè)‘驗(yàn)’字end picname=[num2str(i) '.fig'];%保存的文件名:如i=1時(shí),picname=1.figaxis off;hold on % 寫后面的字時(shí),不把前面的字沖掉saveas(gcf,picname) %保存下中間結(jié)果, end stepall=4; for i=1:stepallpicname=[num2str(i) '.fig'];open(picname) % set(gcf,'outerposition',get(0,'screensize'));% matlab窗口最大化frame=getframe(gcf); im=frame2im(frame);%制作gif文件,圖像必須是index索引圖像 [I,map]=rgb2ind(im,20); if i==1imwrite(I,map,'baidujingyan.gif','gif', 'Loopcount',inf,'DelayTime',0.5);%第一次必須創(chuàng)建!elseif i==stepallimwrite(I,map,'baidujingyan.gif','gif','WriteMode','append','DelayTime',0.5);elseimwrite(I,map,'baidujingyan.gif','gif','WriteMode','append','DelayTime',0.5);end close alldelete(picname); end
3.讀寫多維tif,可參考博客:
https://blog.csdn.net/u013921430/article/details/79283305
為了方便看,這里copy 一下:
灰度tiff讀寫代碼
彩色tiff圖像讀寫代碼:
clear all clc;filepath='test.tif'; %%圖像名稱與路徑 Info=imfinfo(filepath); %%獲取圖片信息并判斷是否為tiftif='tif'; format=Info.Format; if (strcmp(format ,tif)==0)disp('載入的不是tif圖像,請(qǐng)確認(rèn)載入的數(shù)據(jù)'); %%確保載入的圖像是tiff圖像 end Slice=size(Info,1); %%獲取圖片z向幀數(shù) Width=Info.Width; Height=Info.Height;Image=zeros(Height,Width,Slice*3);for i=1:SliceImage(:,:,(i-1)*3+1:i*3)=imread(filepath,i); %%一層一層的讀入彩色圖像 end %%%%%%%%%%%%%%%%%%%%% 圖像處理操作 %%%%%%%%%%%%%%%%%%%%% for i=1:SliceJ=uint8(Image(:,:,(i-1)*3+1:i*3)); %%一層一層寫出圖像 %%imwrite(J,[num2str(i,'%4d'),'.tif'],'WriteMode','Append');imwrite(J,[num2str(i,'%04d'),'.tif']); end3.例子(geotiff)
如何讀取tif并且獲取其經(jīng)緯度信息;讀取之后還要把它另存為另一個(gè)tif呢?這個(gè)問(wèn)題問(wèn)的可能有點(diǎn)作,但是我今天缺失要實(shí)現(xiàn)這個(gè)功能,因?yàn)槲矣幸粡坱if的模板圖片,還有很多張比較大的圖片。我想把所有的圖片都裁剪成和模板圖片一樣的大小,用arcgis或者envi的話會(huì)一個(gè)一個(gè)操作,太枯燥了,所以我想著能否用matlab幫我裁剪。話不多說(shuō),直接開整:
file20150='G:\Light\data\annual\2015\20150.tif'; Info0=geotiffinfo(file20150); %將tif的信息都搞到一個(gè)叫Info0的結(jié)構(gòu)體中 img0=imread(file20150); %讀取圖像的灰度信息第二行,得到的結(jié)構(gòu)體如下:
里邊包含的信息比較豐富,像坐標(biāo)系(GCS)、分辨率(PixelScale)、經(jīng)緯度(BoundingBox)等等,關(guān)于經(jīng)緯度這個(gè),下面記下筆記,真的很容易忘。
下面用imshow()顯示一下矩陣:
如果正常讀的話,
可見,它是被上下翻轉(zhuǎn)了一下,所以,我們要先提前翻轉(zhuǎn)一下,再寫入文件。
ok。再來(lái)對(duì)比一下,info信息:
可以看到,圖片的大小發(fā)生了變化,其他信息保持不變。
總結(jié)代碼如下所示:
三、其他文件
1.nc 文件
其實(shí) nc 文件也是文本文件,但是是比較專業(yè)化那種,matlab 專門提供了讀取 nc 文件的函數(shù)。
//nc文件的讀取 filename='A20160922016121.L3m_MO_SST_sst_4km.nc'; ncdisp(filename);//展示文件包含的信息 Lon = ncread(filename);//讀取信息到Lon中2.excle
a=xlsread('1.xlsx'); %讀 [num,txt,raw]=xlsread(file,2);%num 存數(shù)字,txt 存文本,raw 存元胞(包含兩者)。第2個(gè)表 xlswrite('2.xlsx',a); %寫 help.. %更多用法若出現(xiàn)Excel Worksheet could not be activated.問(wèn)題,
解決辦法:打開excel,“文件→選項(xiàng)→加載項(xiàng)→管理(位于界面坐下角)→點(diǎn)擊選擇COM加載項(xiàng)→轉(zhuǎn)到→把可用加載項(xiàng)的√全部去掉“,之后重啟 matlab 即可。
3.vbb2txt
vbb文件是啥類型的文件呢?目前沒有找到比較正規(guī)的解釋,我好像是在大二時(shí)做行人檢測(cè)的時(shí)候遇到過(guò)。vbb直接打開是亂碼,所以需要借助一個(gè)vbb工具箱,把vbb轉(zhuǎn)換成txt,工具箱鏈接下面會(huì)提供,還有一個(gè)數(shù)據(jù)集當(dāng)時(shí)下的,壓縮超nb,128M的直接壓成了13M。
工具箱:鏈接: https://pan.baidu.com/s/1ZdfH1kot7eT8DZbBaS1uYg 提取碼: uub8
數(shù)據(jù)集:鏈接: https://pan.baidu.com/s/1GpUI4P3lyGkBm56-oMtV4A 提取碼: akq4
下好工具箱解壓后,將文件夾放在一個(gè)不常動(dòng)的地方,我放在了D:\MATLAB\R2017a\toolbox中,然后打開matlab,點(diǎn)擊set path(設(shè)置路勁),將vbb路徑加進(jìn)去就行了。測(cè)試是否成功的話,就在matlab命令空間敲help vbb,成功的話就不會(huì)報(bào)錯(cuò)。vbb轉(zhuǎn)txt的話,下面提供一個(gè)函數(shù):
function vbb2txt(file,out) A = vbb( 'vbbLoad',file);%當(dāng)然不要拘泥于此函數(shù),具體問(wèn)題具體分析,可以看看A是啥 c=fopen(out,'w'); for i = 1:A.nFrameiframe = A.objLists(1,i);iframe_data = iframe{1,1};n1length = length(iframe_data);for j = 1:n1lengthiframe_dataj = iframe_data(j);if iframe_dataj.pos(1) ~= 0 %pos ?posvfprintf(c,'%d %s %f %f %f %f \r\n', i, 'person', iframe_dataj.pos(1), iframe_dataj.pos(2), iframe_dataj.pos(3), iframe_dataj.pos(4));endend end fclose(c); disp('Finished'); end4.shp文件
第一次接觸shp文件是在大一時(shí)上CAD時(shí)接觸的,那時(shí)候叫“形文件”。我目前理解中的shp文件有點(diǎn)像矢量圖,它存儲(chǔ)的是坐標(biāo),可無(wú)限放大,不會(huì)出現(xiàn)馬賽克(不知道對(duì)不對(duì),2020.8.22)。shp 包括一個(gè)主文件,一個(gè)索引文件,和一個(gè)dBASE表。
| 主文件 | .shp | 主文件是一個(gè)直接存取,變量記錄長(zhǎng)度文件,其中每個(gè)記錄描述一個(gè)有它自己的vertices列表的shape。 |
| 索引文件 | .shx | 在索引文件中,每個(gè)記錄包含對(duì)應(yīng)主文件記錄離主文件頭開始的偏移, |
| dBASE文件 | .dbf | dBASE表包含 feature 一個(gè)記錄的feature的特征。 |
幾何和屬性間的一一對(duì)應(yīng)關(guān)系是基于記錄數(shù)目的。在dBASE文件中的屬性記錄必須和主文件中的記錄是相同順序的。
讀寫代碼
shp=shaperead(filename); //這步搞出來(lái)一個(gè)shp結(jié)構(gòu)體 shapewrite(shp,filename);//這步搞出來(lái)三個(gè)文件,如上所述世界如此簡(jiǎn)單,更多詳見help!
參考/引用 文章
[1] 仙女陽(yáng)-CSDN博主:https://blog.csdn.net/wangyang20170901/article/details/79617881 [2] 樣young-CSDN博主:https://blog.csdn.net/jisuanjiguoba/article/details/79997805 [3] 百度經(jīng)驗(yàn)-https://jingyan.baidu.com/article/9f63fb917c09ecc8410f0e66.html [4] 不用先生-CSDN博主:https://blog.csdn.net/u013921430/article/details/79283305 [5] 百度經(jīng)驗(yàn):https://jingyan.baidu.com/article/a378c960a47c24b3282830b7.html [6] csdn_funquiz-CSDN博主:https://blog.csdn.net/qq_38712026/article/details/78783422總結(jié)
以上是生活随笔為你收集整理的用MATLAB 读写各种文件 ∈ Matlab 使用笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php移动签批源码_PHP让网站移动访问
- 下一篇: linux中initrd的含义,Linu