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