1、圖像的讀取
MATLAB中從圖像文件中讀取數據用函數imread(),這個函數的作用就是將圖像文件的數據讀入矩陣中,此外還可以用imfinfo()函數查看圖像文件的信息(見例1)
%例1:圖像數據及圖像信息的讀取
imfinfo c:/lilizong/boat.bmp
%讀取圖像信息
[A,M]=imread('c:/lilizong/boat.bmp');
%圖像數據的讀取,將圖像數據放入矩陣A中,顏色數據放入矩陣M中
imshow(A,M);title('原圖像');
M(:,1)=0; %將顏色數據矩陣的一列置零
figure
imshow(A,M);title('改變顏色后的圖像')
MATLAB還提供了將數據寫入一個文件的函數imwrite以及不同類型文件相互轉換的函數,可以參考MATLAB 的幫助文件。
2、灰度直方圖及直方圖均衡化
灰度直方圖用於顯示圖像的灰度值分布情況,是數字圖像處理中最簡單和最實用的工具。MATLAB中提供了專門繪制直方圖的函數imhist()。用它可以很簡單的繪制出一幅圖像的灰度直方圖(見例2)。
%例2:直方圖的顯示
imshow('c:/lilizong/boat.bmp');title('原圖像')
%顯示原圖像
A=imread('e:/matlabwork/tuxiang/Girl.bmp','bmp');
figure;imhist(A),title('對應直方圖')
在圖像處理中,點運算是簡單而又重要的一種技術,其中最常用的一種應用就是直方圖的均衡化(見例3)。
%例3:直方圖均衡化
imshow('c:/lilizong/boat1.bmp');title('原圖像')
I=imread('c:/lilizong/boat1.bmp');
figure;imhist(I),title('對應直方圖')
%從得到的直方圖可以看出,圖像的對比度很低,灰度級集中在70-160范圍內,如果只取
%這個范圍內的灰度,並擴展到[0,255],則會明顯增強圖像對比度
J=imadjust(I,[70/255 160/255],[]);
figure;imshow(J),title('經灰度級調整后的圖')
figure;imhist(J),title('灰度級調整后的直方圖')
%MATLAB還提供了histeq函數(自動直方圖均衡化)
K=histeq(I);
figure;imshow(K),title('經直方圖均衡化后的圖')
figure;imhist(K),title('直方圖均衡化后的直方圖')
3、圖像的代數運算
代數運算是指對兩幅輸入圖像進行點對點的加、減、乘和除計算而得到輸出圖像的運算。對於相加和相乘的情形,可能不止有兩幅圖像參加運算。圖像相加的一個重要應用是對同一場景的多幅圖像求平均值。這點被經常用來有效地降低加性(additive)隨機噪聲的影響(見例4)
%例4:圖象加噪聲再通過多次相加求平均的方法祛除噪聲
[I,M]=imread('c:/boat.png');
J=imnoise(I,'salt & pepper',0.005);
subplot(1,2,1),imshow(I,M),title('原圖象');
subplot(1,2,2),imshow(J,M),title('加噪聲后圖象');
K=zeros(256);
for i=1:100
J=imnoise(I,'salt & pepper',0.005);
J1=im2double(J);
% K=K+J1;
K=K+J1;
end
K=K/100;
figure,imshow(K),title('相加求平均后的圖象');
4、圖像濾波處理
在數字圖像處理中,常常會遇到圖像中混雜有許多的噪聲。因此,在進行圖像處理中,有時要先進行祛除噪聲的工作。最常用的祛除噪聲的方法是用濾波器進行濾波處理。MATLAB的圖像處理工具箱里也設計了許多的濾波器。如均值濾波器、中值濾波器、維納濾波器等。用戶可以很方便的運用一些函數完成數字濾波工作。(見例5)。
%例5:用濾波器祛除圖象噪聲(分別用均值濾波,中值濾波,及維納濾波器祛除加入高斯噪聲的圖象)
I=imread('C:/boat.png');
J=imnoise(I,'gaussian',0,0.002); %加入高斯噪聲
%進行均值濾波
h=fspecial('average',3); %fspecial函數用於產生預定義濾波器
I2=uint8(round(filter2(h,I))); %filter2函數用於圖像濾波,此處h是濾波參數(均值),I是要處理的圖像
%進行中值濾波
I3=medfilt2(J,[3,3]); %medfilt2函數用於圖像的中值濾波
%進行維納濾波
I4=wiener2(J,[3,3]);%進行一次維納濾波
I5=wiener2(I4,[3,3]);%進行二次維納濾波
subplot(2,3,1),imshow(I),title('原圖象')
subplot(2,3,2),imshow(J),title('加噪聲圖象')
subplot(2,3,3),imshow(I2),title('均值濾波后圖象')
subplot(2,3,4),imshow(I3),title('中值濾波后圖象')
subplot(2,3,5),imshow(I4),title('維納濾波后圖象')
subplot(2,3,6),imshow(I5),title('兩次維納濾波后圖象')
5、傅立葉變換
傅立葉變換是線性系統分析的一個有力的工具。它在圖像處理,特別是在圖像增強、復原和壓縮中,扮演着非常重要的作用。實際中一般采用一種叫做快速傅立葉變換(FFT)的方法,MATLAB中的fft2指令用於得到二維FFT的結果,ifft2指令用於得到二維FFT逆變換的結果。(見例6)
%例6:近似沖擊函數的二維快速傅立葉變換(FFT)
x=1:99;y=1:99;
[X,Y]=meshgrid(x,y);
A=zeros(99,99);
A(49:51,49:51)=1;
B=fft2(A);
subplot(1,2,1),imshow(A),xlabel('空域圖象');
subplot(1,2,2),imshow(B),xlabel('時域圖象');
figure
subplot(1,2,1),mesh(X,Y,A),xlabel('空域'),grid on;
subplot(1,2,2),mesh(X,Y,abs(B)),xlabel('時域'),grid on;
6、圖像壓縮
在圖像的變換和壓縮中,常常用到離散余弦變換(DCT)。DCT具有能使圖像的最重要的信息集中在DCT的幾個系數上的性能。正是基於此,DCT通常應用於圖像的壓縮。(見例7)
JPEG圖像壓縮算法:
輸入圖像被分成8*8或16*16的小塊,然后對每一小塊進行二維DCT(離散余弦變換)變換,變換后的系數量化、編碼並傳輸;
JPEG文件解碼量化了的DCT系數,對每一塊計算二維逆DCT變換,最后把結果塊拼接成一個完整的圖像。在DCT變換后舍棄那些不嚴重影響圖像重構的接近0的系數。
DCT變換的特點是變換后圖像大部分能量集中在左上角,因為左上放映原圖像低頻部分數據,右下反映原圖像高頻部分數據。而圖像的能量通常集中在低頻部分。
%例7:DCT變換用於圖象的壓縮實例
I=imread('d:/lilizong/test.jpg');
%該圖片在安裝matlab的目錄中找,原圖為灰度圖象
I=im2double(I);%圖像存儲類型轉換
T=dctmtx(8);%離散余弦變換矩陣
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%對原圖像進行DCT變換
mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
%數據壓縮,丟棄右下角高頻數據
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
%進行DCT反變換,得到壓縮后的圖像
imshow(I)
title('原始圖像')
figure;
imshow(I2)
title('壓縮后的圖像')
應用到的函數:
I=imread('圖像文件名') :讀取圖像數據,保存在矩陣I中;
imshow(I) :顯示灰度圖像I,其他用法見matlab幫助;
I2=im2double(I1) :把圖像數組I1轉換成double精度類型;
D=dctmtx(n) :二維離散余弦變換函數,返回n*n離散余弦變換矩陣。
一個n*n的變換矩陣T被定義成:
Tpq=1/sqrt(n)
,當p=0,0<=q<=M-1;
Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n]
,當1<=p<=M-1,0<=q<=M-1。
B=blkproc(A,[m n],fun,P1,P2...) :塊操作函數。對圖像A的每個不同的m*n塊應用fun函數,P1,P2等為fun函數參數。在圖像邊緣用0來擴展;只有當fun的返回矩陣是m*n矩陣時,B和A的大小才相同。
figure:強制生成一個新的個繪圖窗口;
可以看出,盡管由於85%的DCT系數被拋棄而使恢復后的圖像質量有所降低,圖像內容仍能清晰可辨,達到了圖像壓縮的目的。