【圖像壓縮】基于小波變換實現(xiàn)圖像壓縮matlab源碼含 GUI
一、簡介
1974年,法國工程師J.Morlet首先提出小波變換的概念,1986年著名數(shù)學家Y.Meyer偶然構造出一個真正的小波基,并與S.Mallat合作建立了構造小波基的多尺度分析之后,小波分析才開始蓬勃發(fā)展起來。小波分析的應用領域十分廣泛,在數(shù)學方面,它已用于數(shù)值分析、構造快速數(shù)值方法、曲線曲面構造、微分方程求解、控制論等。在信號分析方面的濾波、去噪聲、壓縮、傳遞等。在圖像處理方面的圖像壓縮、分類、識別與診斷,去噪聲等。本章將著重闡述小波在圖像中的應用分析。
1 小波變換原理
小波分析是一個比較難的分支,用戶采用小波變換,可以實現(xiàn)圖像壓縮,振動信號的分解與重構等,因此在實際工程上應用較廣泛。小波分析與Fourier變換相比,小波變換是空間域和頻率域的局部變換,因而能有效地從信號中提取信息。小波變換通過伸縮和平移等基本運算,實現(xiàn)對信號的多尺度分解與重構,從而很大程度上解決了Fourier變換帶來的很多難題。
小波分析作一個新的數(shù)學分支,它是泛函分析、Fourier分析、數(shù)值分析的完美結晶;小波分析也是一種“時間—尺度”分析和多分辨分析的新技術,它在信號分析、語音合成、圖像壓縮與識別、大氣與海洋波分析等方面的研究,都有廣泛的應用。
(1)小波分析用于信號與圖像壓縮。小波壓縮的特點是壓縮比高,壓縮速度快,壓縮后能保持信號與圖像的特征不變,且在傳遞中能夠抗干擾?;谛〔ǚ治龅膲嚎s方法很多,具體有小波壓縮,小波包壓縮,小波變換向量壓縮等。
(2)小波也可以用于信號的濾波去噪、信號的時頻分析、信噪分離與提取弱信號、求分形指數(shù)、信號的識別與診斷以及多尺度邊緣檢測等。
(3)小波分析在工程技術等方面的應用概括的包括計算機視覺、曲線設計、湍流、遠程宇宙的研究與生物醫(yī)學方面。
2 多尺度分析

3 圖像的分解和量化

4 圖像壓縮編碼

5 圖像編碼評價

unction varargout = multi_wavelet(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', ? ? ? mfilename, ...
? ? ? ? ? ? ? ? ? 'gui_Singleton', ?gui_Singleton, ...
? ? ? ? ? ? ? ? ? 'gui_OpeningFcn', @multi_wavelet_OpeningFcn, ...
? ? ? ? ? ? ? ? ? 'gui_OutputFcn', ?@multi_wavelet_OutputFcn, ...
? ? ? ? ? ? ? ? ? 'gui_LayoutFcn', ?[] , ...
? ? ? ? ? ? ? ? ? 'gui_Callback', ? []);
if nargin && ischar(varargin{1})
? ?gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
? ?[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
? ?gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before multi_wavelet is made visible.
function multi_wavelet_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject ? ?handle to figure
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
% varargin ? command line arguments to multi_wavelet (see VARARGIN)
% Choose default command line output for multi_wavelet
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes multi_wavelet wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = multi_wavelet_OutputFcn(hObject, eventdata, handles)
% varargout ?cell array for returning output args (see VARARGOUT);
% hObject ? ?handle to figure
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject ? ?handle to pushbutton1 (see GCBO)
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
global I ;
[fname,pname]=uigetfile('*.*');
I=imread(strcat(pname,'\',fname));
[m,n,k]=size(I);
if k~=1
I=rgb2gray(I);
end
I=double(I);
axes(handles.axes1);
imshow(mat2gray(I));
title('原始圖像的灰度圖');
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject ? ?handle to popupmenu1 (see GCBO)
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns popupmenu1 contents as cell array
% ? ? ? ?contents{get(hObject,'Value')} returns selected item from popupmenu1
global I ;
w1=get(handles.popupmenu1,'value')
switch w1 ? %選擇小波基
case 1
? w2= 'bior 3.7';
case 2
? ?w2='bior 1.1';
case 3 ? ?
? ?w2='bior 1.3';
case 4 ? ?
? ?w2='bior 1.5';
case 5 ? ?
? w2='bior 2.2';
case 6 ?
? w2='bior 2.4';
case 7 ?
? w2= 'bior 2.6';
case 8 ?
? ?w2='bior 2.8';
case 9 ? ?
? ?w2='bior 3.1';
case 10 ? ?
? ?w2='bior 3.3';
case 11 ? ?
? ?w2='bior 3.5';
case 12 ? ?
? ?w2='bior 3.9';
case 13 ? ?
? ?w2='bior 4.4';
case 14 ? ?
? ?w2='bior 5.5';
case 15 ? ?
? ?w2='bior 6.8';
case 16 ? ?
? ?w2='db1';
case 17 ? ?
? ?w2='db4';
case 18 ? ?
? ?w2='db15';
end
disp('壓縮前圖像的大小');%顯示文字
whos('I') ? ? ? ? ? %顯示圖像屬性
% 進行二維小波變換 'bior3.7'
[a,b] = wavedec2(I, 3,w2); % 分三層,wavedec2:2維多層小波分解
% 提取各層低頻信息
c1 = appcoef2( a, b,w2, 1 );%提取二維小波分解低頻系數(shù)
axes(handles.axes18);
imshow(c1, []);
title('第一層低頻部分:');
ca1=wcodemat(c1,440,'mat',0); ? %對第一層信息進行量化編碼
axes(handles.axes2);
imshow(ca1, []);
title('第一次壓縮后圖像:');
disp('第一次壓縮圖像的大小');%顯示文字
whos('ca1');
c2= appcoef2( a, b,w2, 2 );
axes(handles.axes19);
imshow(c2, []);
title('第二層低頻部分:');
ca2=wcodemat(c2,440,'mat',0); ? %對第一層信息進行量化編碼
axes(handles.axes6);
三、運行結果



?