matlab中图像读写
一. 讀寫圖像文件
1. imread
imread函數用于讀入各種圖像文件,如:a=imread('e:/w01.tif')
注:計算機E盤上要有w01相應的.tif文件。
2. imwrite
imwrite函數用于寫入圖像文件,如:imwrite(a,'e:/w02.tif',’tif’)
3. imfinfo
imfinfo函數用于讀取圖像文件的有關信息,如:imfinfo('e:/w01.tif')
二. 圖像的顯示
1. image
image函數是MATLAB提供的最原始的圖像顯示函數(主要彩色顯示圖象),如:
a=[1,2,3,4;4,5,6,7;8,9,10,11,12];
image(a);
2. imshow
imshow函數用于灰度圖像文件的顯示,如:
i=imread('e:/w01.tif');
imshow(i);
3. colorbar
colorbar函數用顯示圖像的顏色條。
通常,顏色映象進行過調節,把數據從最小擴展到最大,也就是說整個顏色映象都用于繪圖。有時也許想改變顏色使用的方法。函數caxis代表顏色軸,因為顏色增加了另一個維數,它允許對數據范圍的一個子集使用整個顏色映象或者對數據的整個集合只使用當前顏色映象的一部分。
?????? [cmin,cmax]=caxis返回映射到顏色映象中第一和最后輸入項的最小和最大的數據。它們通常被設成數據的最小值和最大值。比如,函數mesh(peaks) 會畫出函數peaks的網格圖,并把顏色軸caxis設為[-6.5466,8.0752],即Z的最小值和最大值。這些值之間的數據點,使用從顏色映象中經插值得到的顏色。如:
i=imread('e:/w01.tif');
imshow(i);
colorbar;
4 .figure
figure函數用于設定圖像顯示窗口,如:figure(1); /figure(2);
5.imagesc(a);?? caxis([-3 8]) ; colorbar;
標尺標度從-3,到8 顯示標度尺。
三. 圖像的變換
1. fft2
fft2函數用于數字圖像的二維傅立葉變換,如:
i=imread('e:/w01.tif');
j=fft2(i);
2. ifft2
ifft2函數用于數字圖像的二維傅立葉反變換,如:
i=imread('e:/w01.tif');
j=fft2(i);
k=ifft2(j);
3. 利用fft2計算二維卷積
利用fft2函數可以計算二維卷積,如:
a=[8,1,6;3,5,7;4,9,2];
b=[1,1,1;1,1,1;1,1,1];
a(8,8)=0;
b(8,8)=0;
c=ifft2(fft2(a).*fft2(b));
c=c(1:5,1:5);
利用conv2(二維卷積函數)校驗, 如:
a=[8,1,6;3,5,7;4,9,2];
b=[1,1,1;1,1,1;1,1,1];
c=conv2(a,b);
四. 模擬噪聲生成函數和預定義濾波器
1. imnoise
imnoise函數用于對圖像生成模擬噪聲,如:
i=imread('e:/w01.tif');
j=imnoise(i,'gaussian',0,0.02);%模擬高斯噪聲
2. fspecial
fspecial函數用于產生預定義濾波器,如:
h=fspecial('sobel');%sobel水平邊緣增強濾波器
h=fspecial('gaussian');%高斯低通濾波器
h=fspecial('laplacian');%拉普拉斯濾波器
h=fspecial('log');%高斯拉普拉斯(LoG)濾波器
h=fspecial('average');%均值濾波器
五. 圖像的增強
1. 直方圖
imhist函數用于數字圖像的直方圖顯示,如:
i=imread('e:/w01.tif');
imhist(i);
2. 直方圖均化
histeq函數用于數字圖像的直方圖均化,如:
i=imread('e:/w01.tif');
j=histeq(i);
3. 對比度調整
imadjust函數用于數字圖像的對比度調整,如:
i=imread('e:/w01.tif');
j=imadjust(i,[0.3,0.7],[]);
4. 對數變換
log函數用于數字圖像的對數變換,如:
i=imread('e:/w01.tif');
j=double(i);
k=log(j);
5. 基于卷積的圖像濾波函數
filter2函數用于圖像濾波,如:
i=imread('e:/w01.tif');
h=[1,2,1;0,0,0;-1,-2,-1];
j=filter2(h,i);
6. 線性濾波
利用二維卷積conv2濾波, 如:
i=imread('e:/w01.tif');
h=[1,1,1;1,1,1;1,1,1];
h=h/9;
j=conv2(i,h);
7. 中值濾波
medfilt2函數用于圖像的中值濾波,如:
i=imread('e:/w01.tif');
j=medfilt2(i);
8. 銳化
(1)利用Sobel算子銳化圖像, 如:
i=imread('e:/w01.tif');
h=[1,2,1;0,0,0;-1,-2,-1];%Sobel算子
j=filter2(h,i);
(2)利用拉氏算子銳化圖像, 如:
i=imread('e:/w01.tif');
j=double(i);
h=[0,1,0;1,-4,0;0,1,0];%拉氏算子
k=conv2(j,h,'same');
m=j-k;
六. 舉例
二維傅立葉變換和二維傅立葉反變換:
i=imread('e:/w01.tif');
figure(1);
imshow(i);
colorbar;
j=fft2(i);
k=fftshift(j);
figure(2);
l=log(abs(k));
imshow(l,[]);
colorbar
n=ifft2(j)/255;
figure(3);
imshow(n);
colorbar;
圖像的變換
1. 離散傅立葉變換的 Matlab 實現
?????? Matlab 函數 fft、fft2 和 fftn 分別可以實現一維、二維和 N 維 DFT 算法;而函數 ifft、ifft2 和 ifftn 則用來計算反 DFT 。這些函數的調用格式如下:
???????? A=fft(X,N,DIM)
?????? 其中,X 表示輸入圖像;N 表示采樣間隔點,如果 X 小于該數值,那么 Matlab 將會對 X 進行零填充,否則將進行截取,使之長度為 N ;DIM 表示要進行離散傅立葉變換。
???????? A=fft2(X,MROWS,NCOLS)
其中,MROWS 和 NCOLS 指定對 X 進行零填充后的 X 大小。
???????? A=fftn(X,SIZE)
其中,SIZE 是一個向量,它們每一個元素都將指定 X 相應維進行零填充后的長度。
?????? 函數 ifft、ifft2 和 ifftn的調用格式于對應的離散傅立葉變換函數一致。
例子:圖像的二維傅立葉頻譜
% 讀入原始圖像
I=imread('lena.bmp');
imshow(I)
% 求離散傅立葉頻譜
J=fftshift(fft2(I));
figure;
imshow(log(abs(J)),[8,10])
2. 離散余弦變換的 Matlab 實現
2.1. dct2 函數
功能:二維 DCT 變換
格式:B=dct2(A)
???????? B=dct2(A,m,n)
???????? B=dct2(A,[m,n])
說明:B=dct2(A) 計算 A 的 DCT 變換 B ,A 與 B 的大小相同;B=dct2(A,m,n) 和 B=dct2(A,[m,n]) 通過對 A 補 0 或剪裁,使 B 的大小為 m×n。
2.2. dict2 函數
功能:DCT 反變換
格式:B=idct2(A)
???????? B=idct2(A,m,n)
???????? B=idct2(A,[m,n])
說明:B=idct2(A) 計算 A 的 DCT 反變換 B ,A 與 B 的大小相同;B=idct2(A,m,n) 和 B=idct2(A,[m,n]) 通過對 A 補 0 或剪裁,使 B 的大小為 m×n。
2.3. dctmtx函數
功能:計算 DCT 變換矩陣
格式:D=dctmtx(n)
說明:D=dctmtx(n) 返回一個 n×n 的 DCT 變換矩陣,輸出矩陣 D 為 double 類型。
3. 圖像小波變換的 Matlab 實現
3.1 一維小波變換的 Matlab 實現
(1) dwt 函數
功能:一維離散小波變換
格式:[cA,cD]=dwt(X,'wname')
???????? [cA,cD]=dwt(X,Lo_D,Hi_D)
說明:[cA,cD]=dwt(X,'wname') 使用指定的小波基函數 'wname' 對信號 X 進行分解,cA、cD 分別為近似分量和細節分量;[cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的濾波器組 Lo_D、Hi_D 對信號進行分解。
(2) idwt 函數
功能:一維離散小波反變換
格式:X=idwt(cA,cD,'wname')
???????? X=idwt(cA,cD,Lo_R,Hi_R)
???????? X=idwt(cA,cD,'wname',L)
???????? X=idwt(cA,cD,Lo_R,Hi_R,L)
說明:X=idwt(cA,cD,'wname') 由近似分量 cA 和細節分量 cD 經小波反變換重構原始信號 X 。
???????? 'wname' 為所選的小波函數
???????? X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重構濾波器 Lo_R 和 Hi_R 經小波反變換重構原始信號 X 。
???????? X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回信號 X 中心附近的 L 個點。
3.2 二維小波變換的 Matlab 實現
?????????? 二維小波變換的函數
-------------------------------------------------
???? 函數名???????????????? 函數功能
---------------------------------------------------
???? dwt2???????????? 二維離散小波變換
?? wavedec2?????? 二維信號的多層小波分解
???? idwt2?????????? 二維離散小波反變換
?? waverec2???????? 二維信號的多層小波重構
?? wrcoef2?????????? 由多層小波分解重構某一層的分解信號
?? upcoef2?????????? 由多層小波分解重構近似分量或細節分量
?? detcoef2???????? 提取二維信號小波分解的細節分量
?? appcoef2???????? 提取二維信號小波分解的近似分量
?? upwlev2???????? 二維小波分解的單層重構
?? dwtpet2???????? 二維周期小波變換
?? idwtper2???????? 二維周期小波反變換
-------------------------------------------------------------
(1) wcodemat 函數
功能:對數據矩陣進行偽彩色編碼
格式:Y=wcodemat(X,NB,OPT,ABSOL)
???????? Y=wcodemat(X,NB,OPT)
???????? Y=wcodemat(X,NB)
???????? Y=wcodemat(X)
說明:Y=wcodemat(X,NB,OPT,ABSOL) 返回數據矩陣 X 的編碼矩陣 Y ;NB 偽編碼的最大值,即編碼范圍為 0~NB,缺省值 NB=16;
?????? OPT 指定了編碼的方式(缺省值為 'mat'),即:
???????????????? OPT='row' ,按行編碼
???????????????? OPT='col' ,按列編碼
???????????????? OPT='mat' ,按整個矩陣編碼
?????? ABSOL 是函數的控制參數(缺省值為 '1'),即:
???????????????? ABSOL=0 時,返回編碼矩陣
???????????????? ABSOL=1 時,返回數據矩陣的絕對值 ABS(X)
(2) dwt2 函數
功能:二維離散小波變換
格式:[cA,cH,cV,cD]=dwt2(X,'wname')
???????? [cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D)
說明:[cA,cH,cV,cD]=dwt2(X,'wname')使用指定的小波基函數 'wname' 對二維信號 X 進行二維離散小波變幻;cA,cH,cV,cD 分別為近似分量、水平細節分量、垂直細節分量和對角細節分量;[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 使用指定的分解低通和高通濾波器 Lo_D 和 Hi_D 分解信號 X 。
(3) wavedec2 函數
功能:二維信號的多層小波分解
格式:[C,S]=wavedec2(X,N,'wname')
???????? [C,S]=wavedec2(X,N,Lo_D,Hi_D)
說明:[C,S]=wavedec2(X,N,'wname') 使用小波基函數 'wname' 對二維信號 X 進行 N 層分解;[C,S]=wavedec2(X,N,Lo_D,Hi_D) 使用指定的分解低通和高通濾波器 Lo_D 和 Hi_D 分解信號 X 。
(4) idwt2 函數
功能:二維離散小波反變換
格式:X=idwt2(cA,cH,cV,cD,'wname')
???????? X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)
???????? X=idwt2(cA,cH,cV,cD,'wname',S)
???????? X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S)
說明:X=idwt2(cA,cH,cV,cD,'wname') 由信號小波分解的近似信號 cA 和細節信號 cH、cH、cV、cD 經小波反變換重構原信號 X ;X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) 使用指定的重構低通和高通濾波器 Lo_R 和 Hi_R 重構原信號 X ;X=idwt2(cA,cH,cV,cD,'wname',S) 和 X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 返回中心附近的 S 個數據點。
(5) waverec2 函數
說明:二維信號的多層小波重構
格式:X=waverec2(C,S,'wname')
???????? X=waverec2(C,S,Lo_R,Hi_R)
說明:X=waverec2(C,S,'wname') 由多層二維小波分解的結果 C、S 重構原始信號 X ,'wname' 為使用的小波基函數;X=waverec2(C,S,Lo_R,Hi_R) 使用重構低通和高通濾波器 Lo_R 和 Hi_R 重構原信號。
圖像處理工具箱1. 圖像和圖像數據
?? 缺省情況下,MATLAB將圖像中的數據存儲為雙精度類型(double),64位浮點
數,所需存儲量很大;MATLAB還支持另一種類型無符號整型(uint8),即圖像矩
陣中每個數據占用1個字節。
?? 在使用MATLAB工具箱時,一定要注意函數所要求的參數類型。另外,uint8
與double兩種類型數據的值域不同,編程需注意值域轉換。
?????????? 從uint8到double的轉換
?? ---------------------------------------------
?????? 圖像類型???????? MATLAB語句
?? ---------------------------------------------
???? 索引色???????????? B=double(A)+1
???? 索引色或真彩色 B=double(A)/255
???? 二值圖像?????????? B=double(A)
?? ---------------------------------------------
???????? 從double到uint8的轉換
?? ---------------------------------------------
?????? 圖像類型???????? MATLAB語句
?? ---------------------------------------------
???? 索引色?????????????? B=uint8(round(A-1))
???? 索引色或真彩色???? B=uint8(round(A*255))
???? 二值圖像???????????? B=logical(uint8(round(A)))
?? ---------------------------------------------
2. 圖像處理工具箱所支持的圖像類型
2.1 真彩色圖像
???? R、G、B三個分量表示一個像素的顏色。如果要讀取圖像中(100,50)處的像素值,
可查看三元數據(100,50,1:3)。
???? 真彩色圖像可用雙精度存儲,亮度值范圍是[0,1];比較符合習慣的存儲方法是用無
符號整型存儲,亮度值范圍[0,255]
2.2 索引色圖像
?? 包含兩個結構,一個是調色板,另一個是圖像數據矩陣。調色板是一個有3列和若干行
的色彩映象矩陣,矩陣每行代表一種顏色,3列分別代表紅、綠、藍色強度的雙精度數。
?? 注意:MATLAB中調色板色彩強度[0,1],0代表最暗,1代表最亮。
?????????? 常用顏色的RGB值
?? --------------------------------------------
???? 顏色???? R?? G?? B?????? 顏色???? R?? G?? B
?? --------------------------------------------
???? 黑???? 0?? 0?? 1?????? 洋紅???? 1?? 0?? 1
???? 白???? 1?? 1?? 1?????? 青藍???? 0?? 1?? 1
???? 紅???? 1?? 0?? 0?????? 天藍 0.67 0?? 1
???? 綠???? 0?? 1?? 0?????? 橘黃???? 1 0.5 0
???? 藍???? 0?? 0?? 1?????? 深紅?? 0.5 0?? 0
???? 黃???? 1?? 1?? 0?????? 灰???? 0.5 0.5 0.5??????
?? --------------------------------------------
???????? 產生標準調色板的函數
?? -------------------------------------------------
???? 函數名?????? 調色板
?? -------------------------------------------------
???? Hsv?????? 色彩飽和度,以紅色開始,并以紅色結束
???? Hot?????? 黑色-紅色-黃色-白色
???? Cool?????? 青藍和洋紅的色度
???? Pink?????? 粉紅的色度
???? Gray?????? 線型灰度
???? Bone?????? 帶藍色的灰度
???? Jet???????? Hsv的一種變形,以藍色開始,以藍色結束
???? Copper???? 線型銅色度
???? Prim?????? 三棱鏡,交替為紅、橘黃、黃、綠和天藍
???? Flag?????? 交替為紅、白、藍和黑
--------------------------------------------------
?? 缺省情況下,調用上述函數灰產生一個64×3的調色板,用戶也可指定調色板大小。
?? 索引色圖像數據也有double和uint8兩種類型。
?? 當圖像數據為double類型時,值1代表調色板中的第1行,值2代表第2行……
?? 如果圖像數據為uint8類型,0代表調色板的第一行,,值1代表第2行……
2.3 灰度圖像
?? 存儲灰度圖像只需要一個數據矩陣。
?? 數據類型可以是double,[0,1];也可以是uint8,[0,255]
2.4 二值圖像
?? 二值圖像只需一個數據矩陣,每個像素只有兩個灰度值,可以采用uint8或double類型存儲。
?? MATLAB工具箱中以二值圖像作為返回結果的函數都使用uint8類型。
2.5 圖像序列
?? MATLAB工具箱支持將多幀圖像連接成圖像序列。
?? 圖像序列是一個4維數組,圖像幀的序號在圖像的長、寬、顏色深度之后構成第4維。
?? 分散的圖像也可以合并成圖像序列,前提是各圖像尺寸必須相同,若是索引色圖像,
調色板也必須相同。
?? 可參考cat()函數???? A=cat(4,A1,A2,A3,A4,A5)
3. MATLAB圖像類型轉換
???????? 圖像類型轉換函數
?? ---------------------------------------------------------------------------
???? 函數名?????????????????????? 函數功能
?? ---------------------------------------------------------------------------
???? dither?????? 圖像抖動,將灰度圖變成二值圖,或將真彩色圖像抖動成索引色圖像
???? gray2ind???? 將灰度圖像轉換成索引圖像
???? grayslice???? 通過設定閾值將灰度圖像轉換成索引色圖像
???? im2bw?????? 通過設定亮度閾值將真彩色、索引色、灰度圖轉換成二值圖
???? ind2gray???? 將索引色圖像轉換成灰度圖像
???? ind2rgb?????? 將索引色圖像轉換成真彩色圖像
???? mat2gray?? 將一個數據矩陣轉換成一副灰度圖
???? rgb2gray???? 將一副真彩色圖像轉換成灰度圖像
???? rgb2ind?????? 將真彩色圖像轉換成索引色圖像
?? ----------------------------------------------------------------------------
4. 圖像文件的讀寫和查詢
4.1 圖形圖像文件的讀取
?? 利用函數imread()可完成圖形圖像文件的讀取,語法:
???? A=imread(filename,fmt)
???? [X,map]=imread(filename,fmt)
???? [...]=imread(filename)
???? [...]=imread(filename,idx) (只對TIF格式的文件)
???? [...]=imread(filename,ref) (只對HDF格式的文件)
?? 通常,讀取的大多數圖像均為8bit,當這些圖像加載到內存中時,Matlab就將其存放
在類uint8中。此為Matlab還支持16bit的PNG和TIF圖像,當讀取這類文件時,Matlab就將
其存貯在uint16中。
?? 注意:對于索引圖像,即使圖像陣列的本身為類uint8或類uint16,imread函數仍將
顏色映象表讀取并存貯到一個雙精度的浮點類型的陣列中。
4.2 圖形圖像文件的寫入
?? 使用imwrite函數,語法如下:
?? imwrite(A,filename,fmt)
?? imwrite(X,map,filename,fmt)
?? imwrite(...,filename)
?? imwrite(...,parameter,value)
?? 當利用imwrite函數保存圖像時,Matlab缺省的方式是將其簡化道uint8的數據格式。
4.3 圖形圖像文件信息的查詢?? imfinfo()函數
5. 圖像文件的顯示
5.1 索引圖像及其顯示
?? 方法一:
?????????? image(X)
?????????? colormap(map)
?? 方法二:
?????????? imshow(X,map)
5.2 灰度圖像及其顯示
?? Matlab 7.0 中,要顯示一副灰度圖像,可以調用函數 imshow 或 imagesc (即
imagescale,圖像縮放函數)
?? (1) imshow 函數顯示灰度圖像
???? 使用 imshow(I)???? 或 使用明確指定的灰度級書目:imshow(I,32)
???? 由于Matlab自動對灰度圖像進行標度以適合調色板的范圍,因而可以使用自定義
大小的調色板。其調用格式如下:
?????????? imshow(I,[low,high])
???? 其中,low 和 high 分別為數據數組的最小值和最大值。
?? (2) imagesc 函數顯示灰度圖像
?? 下面的代碼是具有兩個輸入參數的 imagesc 函數顯示一副灰度圖像
?????? imagesc(1,[0,1]);
?????? colormap(gray);
???? imagesc 函數中的第二個參數確定灰度范圍。灰度范圍中的第一個值(通常是0),
對應于顏色映象表中的第一個值(顏色),第二個值(通常是1)則對應與顏色映象表
中的最后一個值(顏色)。灰度范圍中間的值則線型對應與顏色映象表中剩余的值(顏色)。
???? 在調用 imagesc 函數時,若只使用一個參數,可以用任意灰度范圍顯示圖像。在該
調用方式下,數據矩陣中的最小值對應于顏色映象表中的第一個顏色值,數據矩陣中的最大
值對應于顏色映象表中的最后一個顏色值。
5.3 RGB 圖像及其顯示
?? (1) image(RGB)
?? 不管RGB圖像的類型是double浮點型,還是 uint8 或 uint16 無符號整數型,Matlab都
能通過 image 函數將其正確顯示出來。
?? RGB8 = uint8(round(RGB64×255)); % 將 double 浮點型轉換為 uint8 無符號整型
?? RGB64 = double(RGB8)/255;???????????? % 將 uint8 無符號整型轉換為 double 浮點型
?? RGB16 = uint16(round(RGB64×65535)); % 將 double 浮點型轉換為 uint16 無符號整型
?? RGB64 = double(RGB16)/65535;?????? % 將 uint16 無符號整型轉換為 double 浮點型
?? (2) imshow(RGB) 參數是一個 m×n×3 的數組
5.4 二進制圖像及其顯示
?? (1) imshow(BW)
?? 在 Matlab 7.0 中,二進制圖像是一個邏輯類,僅包括 0 和 1 兩個數值。像素 0 顯示
為黑色,像素 1 顯示為白色。
?? 顯示時,也可通過NOT(~)命令,對二進制圖象進行取反,使數值 0 顯示為白色;1 顯示
為黑色。
?? 例如: imshow(~BW)
?? (2) 此外,還可以使用一個調色板顯示一副二進制圖像。如果圖形是 uint8 數據類型,
則數值 0 顯示為調色板的第一個顏色,數值 1 顯示為第二個顏色。
?? 例如: imshow(BW,[1 0 0;0 0 1])??
5.5 直接從磁盤顯示圖像
?? 可使用一下命令直接進行圖像文件的顯示:
???????? imshow filename
?? 其中,filename 為要顯示的圖像文件的文件名。
?? 如果圖像是多幀的,那么 imshow 將僅顯示第一幀。但需注意,在使用這種方式時,圖像
數據沒有保存在Matlab 7.0 工作平臺。如果希望將圖像裝入工作臺中,需使用 getimage 函
數,從當前的句柄圖形圖像對象中獲取圖像數據,
?? 命令形式為: rgb = getimage;
總結
以上是生活随笔為你收集整理的matlab中图像读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab优化应用
- 下一篇: 改小matlab的绘图大小、字号、线宽