【圖像修復】基于中值、均值、維納、最小平方多種算法實現(xiàn)圖像恢復含Matlab源碼
1 簡介
?1.1圖像處理的概念
數(shù)字圖像處理(Digital Image Processing)是通過計算機將圖像信號轉(zhuǎn)換成數(shù)字信號并對其進行去除噪聲、增強、復原、分割、提取特征等處理的過程。
早期的圖像處理的目的是改善圖像的質(zhì)量,它以人為對象,以改善人的視覺效果為目的。圖像處理中,輸入的是質(zhì)量低的圖像,輸出的是改善質(zhì)量后的圖像,常用的圖像處理方法有圖像增強、復原、編碼、壓縮等。如今,圖像處理技術在許多應用領域受到廣泛重視并取得了重大的開拓性成就,如航空航天、生物醫(yī)學工程、工業(yè)檢測、機器人視覺、公安司法、軍事制導、文化藝術等。數(shù)字圖像處理在通信領域有特殊的用途及應用前景。傳真通信、可視電話、會議電視、多媒體通信、計算機視覺,以及寬帶綜合業(yè)務數(shù)字網(wǎng)(B-ISDN)和高清晰度電視(HDTV)都采用了數(shù)字圖像處理技術。
???1.2噪聲描述及類型
對人類來說,噪聲可以理解為" 妨礙人們感覺器官對所接收的信源信息理解的因素"。而圖像中各種妨礙人們對其信息接收的因素就是圖像噪聲。對信號來說,噪聲是一種外部干擾,但噪聲本身也是一種信號,只不過它攜帶的是噪聲源的信息而已。信噪比(SNR)是衡量噪聲強度的一個重要參數(shù)。噪聲在理論上定義為"不可預測,只能用概率統(tǒng)計方法來認識的隨機誤差"。因此可將圖像噪聲看成是多維隨機過程,描述噪聲的方法也可以借用隨機過程的描述,即概率分布函數(shù)和概率密度函數(shù)。
由噪聲的形成原因,可將噪聲分為以下幾種:
(1)熱噪聲,即導電載流子由于熱擾動產(chǎn)生的噪聲,一般認為它可以產(chǎn)生對不同波長有相同能量的頻譜。
(2)閃爍噪聲,即電流運動導致的噪聲,一般具有反比于頻率的頻譜,也稱為1/f噪聲或者粉色噪聲。
(3)發(fā)射噪聲,即電子運動隨機性的結果,也稱為房頂雨。
(4)有色噪聲,級具有非白色頻譜的寬帶噪聲,如粉色噪聲和褐色噪聲。
由噪聲的概率密度函數(shù)可以將噪聲分為高斯噪聲、均勻噪聲、脈沖噪聲。
???1.3圖像恢復的意義
一般地,對圖像進行處理的主要目的有三個方面:
(1)提高圖像的視感質(zhì)量,如進行圖像的亮度、彩色變換,增強、抑制某些成分,對圖像進行幾何變換等,以改善圖像的質(zhì)量。
(2)提取圖像中所包含的某些特征或特殊信息。提取的特征可以包括很多方面,如頻域特征、灰度或顏色特征、邊界特征、區(qū)域特征、紋理特征、形狀特征、拓撲特征和關系結構等。
(3)圖像數(shù)據(jù)的變換、編碼和壓縮,以便于圖像的存儲和傳輸。
而圖像恢復是圖像處理的重要組成部分。圖像恢復是通過計算機處理,對質(zhì)量下降的圖像加以重建或恢復的處理過程。因攝像機與物體相對運動、系統(tǒng)誤差、畸變、噪聲等因素的影響,使圖像往往不是真實景物的完善映像,此時就需要進行圖像恢復處理。在圖像恢復中,需建立造成圖像質(zhì)量下降的退化模型,然后運用相反過程來恢復原來圖像,并運用一定準則來判定是否得到圖像的最佳恢復。
2 部分代碼
function varargout = hx1(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', ? ? ? mfilename, ...
? ? ? ? ? ? ? ? ? 'gui_Singleton', ?gui_Singleton, ...
? ? ? ? ? ? ? ? ? 'gui_OpeningFcn', @hx1_OpeningFcn, ...
? ? ? ? ? ? ? ? ? 'gui_OutputFcn', ?@hx1_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
function hx1_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = hx1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
? ?set(hObject,'BackgroundColor','white');
end
function file_Callback(hObject, eventdata, handles)
function recover_Callback(hObject, eventdata, handles)
function distortion_Callback(hObject, eventdata, handles)
% 關于
function about_Callback(hObject, eventdata, handles)
H=['本程序在MATLAB R2013b上編寫,目的是減輕干擾和噪聲對圖像的影響,進行圖像恢復。']
helpdlg(H,'相關信息');
% 中值濾波恢復
function medfilter_Callback(hObject, eventdata, handles)
file=get(handles.edit1,'string');
x=imread(file);
f=imnoise(x,'gaussian',0,0.01); ? ? ? ? ? ? ? %給原圖加入高斯噪聲
axes(handles.axes2); ? ? ? ? ? ?
imshow(f); title('加高斯噪聲后的圖像');
g1=medfilt2(f(:,:,1));%R
g2=medfilt2(f(:,:,2));%G
g3=medfilt2(f(:,:,3));%B
g(:,:,1)=g1;
g(:,:,2)=g2;
g(:,:,3)=g3;
axes(handles.axes3); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%輸出圖像
imshow(g); ?title('中值濾波后的圖像'); ?
%均值濾波恢復
function averagefilter_Callback(hObject, eventdata, handles)
file=get(handles.edit1,'string');
x=imread(file);
f=imnoise(x,'gaussian',0,0.01); ? ? ? ? ? ? ? %給原圖加入高斯噪聲
axes(handles.axes2); ? ? ? ? ? ?
imshow(f); title('加高斯噪聲后的圖像');
f1=(f(:,:,1));%R
f2=(f(:,:,2));%G
f3=(f(:,:,3));%B
y0=fspecial('average',5); ? ? ? ? ? ? ? ? ? ? %進行均值濾波
y1=filter2(y0,f1)/255;
y2=filter2(y0,f2)/255;
y3=filter2(y0,f3)/255;
y(:,:,1)=y1;
y(:,:,2)=y2;
y(:,:,3)=y3;
axes(handles.axes3); ? ? ? ? ?%輸出圖像
imshow(y); title('均值濾波后的圖像');
% L-R恢復
function LR_Callback(hObject, eventdata, handles)
file=get(handles.edit1,'string');
h=fspecial('motion',41,11);
x=imread(file);
x1=im2double(x);
z=imfilter(x1,h,'conv','circular');
z1=imnoise(z,'gaussian',0,0.001);
axes(handles.axes2); ? ? ? ? ?%輸出圖像
imshow(z1); title('退化后的圖像');
DAMPAR=0.01;
LIM=ceil(size(h,1)/2);
WEIGHT=zeros(size(z1));
WEIGHT(LIM+1:end-LIM,LIM+1:end-LIM)=1;
NUMIT=17;
%迭代15次的復原,迭代次數(shù)越多,去模糊的效果越好,可通過具體情況調(diào)整
z2=deconvlucy(z1,h,NUMIT,DAMPAR,WEIGHT);
axes(handles.axes3); ? ? ? ? ?%輸出圖像
imshow(z2); title('L-R算法恢復后的圖像');
% 盲去卷積恢復,由于有迭代次數(shù),顯示圖像速度較慢
function mangqujuanji_Callback(hObject, eventdata, handles)
file=get(handles.edit1,'string');
h=fspecial('motion',40,10);
x=imread(file);
x1=im2double(x);
z=imfilter(x1,h,'conv','circular');
z1=imnoise(z,'gaussian',0,0.001);
axes(handles.axes2); ? ? ? ? ?%輸出圖像
imshow(z1); title('退化后的圖像');
DAMPAR=0.01;
LIM=ceil(size(h,1)/2);
INITPSF=ones(size(h));
WEIGHT=zeros(size(z1));
WEIGHT(LIM+1:end-LIM,LIM+1:end-LIM)=1;
NUMIT=15;%盲去卷積迭代的次數(shù),需要依具體情況調(diào)試到適當?shù)闹?/code>
[z2,PSF]=deconvblind(z1,INITPSF,NUMIT,DAMPAR,WEIGHT);
axes(handles.axes3); ? ? ? ? ?%輸出圖像
imshow(z2); title('盲去卷積恢復后的圖像');
%旋轉(zhuǎn)
function xuanzhuan_Callback(hObject, eventdata, handles)
file=get(handles.edit1,'string');
x=imread(file);
%x=rgb2gray(x);
a1=[cos(pi/4) sin(pi/4) 0;-sin(pi/4) cos(pi/4) 0;0 0 1];
a2=[cos(pi/4) -sin(pi/4) 0;sin(pi/4) cos(pi/4) 0;0 0 1];
b1=maketform('affine',a1);
b2=maketform('affine',a2);
c1=imtransform(x,b1);
c2=imtransform(x,b2);
axes(handles.axes2); ? ? ? ? ?%輸出圖像
imshow(c1); title('順時針旋轉(zhuǎn)45度的圖像');
axes(handles.axes3);
imshow(c2); title('逆時針旋轉(zhuǎn)45度的圖像');
1:kk(2))=y;
? ? ? %小波重構
? ? ? ?function y=reconstruct(fusion,s,wtype)
? ? ? ? ? ? if nargin<3
? ? ? ? ? ? wtype='haar';
? ? ? ? ? ? end
? ? ? y=waverec2(fusion,s,wtype);
%對載入的兩幅聚焦不同的圖像進行融合處理
function imagefuse_Callback(hObject, eventdata, handles)
ima=get(handles.edit1,'string');
imb=get(handles.edit2,'string');
[imA,map1]=imread(ima);
[imB,map2]=imread(imb);
m1=double(imA)/256;
m2=double(imB)/256;
zt=2;
wtype='haar';
[c0,s0]=wave_decompose(m1,zt,wtype);
[c1,s1]=wave_decompose(m2,zt,wtype);
fusion=fuse_process(c0,c1,s0,s1);
y=reconstruct(fusion,s0,wtype);
y1=im2uint8(mat2gray(y));
axes(handles.axes3);
imshow(y1); title('融合的圖像');
% 清零
function clear_Callback(hObject, eventdata, handles)
cla(handles.axes1);
cla(handles.axes2);
cla(handles.axes3);
%幫助
function help_Callback(hObject, eventdata, handles)
M=['使用本GUI界面時,若進行圖像恢復需先打開一幅原始圖片;若進行圖像融合,需先載入兩幅待融合的圖片,然后初始化,最后點擊圖像融合按鈕即可']
helpdlg(M,'幫助');
3 仿真結果

4 參考文獻
[1]章毓晉.圖像工程(上冊)圖像處理.清華大學出版社,2013年.
[2]阮秋琦等譯.數(shù)字圖像處理(MATLAB版).電子工業(yè)出版社,2005.
博主簡介:擅長智能優(yōu)化算法、神經(jīng)網(wǎng)絡預測、信號處理、元胞自動機、圖像處理、路徑規(guī)劃、無人機等多種領域的Matlab仿真,相關matlab代碼問題可私信交流。
部分理論引用網(wǎng)絡文獻,若有侵權聯(lián)系博主刪除。
