1 简介
1.1图像处理的概念
数字图像处理(Digital Image Processing)是通过计算机将图像信号转换成数字信号并对其进行去除噪声、增强、复原、分割、提取特征等处理的过程。
早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。如今,图像处理技术在许多应用领域受到广泛重视并取得了重大的开拓性成就,如航空航天、生物医学工程、工业检测、机器人视觉、公安司法、军事制导、文化艺术等。数字图像处理在通信领域有特殊的用途及应用前景。传真通信、可视电话、会议电视、多媒体通信、计算机视觉,以及宽带综合业务数字网(B-ISDN)和高清晰度电视(HDTV)都采用了数字图像处理技术。
1.2噪声描述及类型
对人类来说,噪声可以理解为" 妨碍人们感觉器官对所接收的信源信息理解的因素"。而图像中各种妨碍人们对其信息接收的因素就是图像噪声。对信号来说,噪声是一种外部干扰,但噪声本身也是一种信号,只不过它携带的是噪声源的信息而已。信噪比(SNR)是衡量噪声强度的一个重要参数。噪声在理论上定义为"不可预测,只能用概率统计方法来认识的随机误差"。因此可将图像噪声看成是多维随机过程,描述噪声的方法也可以借用随机过程的描述,即概率分布函数和概率密度函数。
由噪声的形成原因,可将噪声分为以下几种:
(1)热噪声,即导电载流子由于热扰动产生的噪声,一般认为它可以产生对不同波长有相同能量的频谱。
(2)闪烁噪声,即电流运动导致的噪声,一般具有反比于频率的频谱,也称为1/f噪声或者粉色噪声。
(3)发射噪声,即电子运动随机性的结果,也称为房顶雨。
(4)有色噪声,级具有非白色频谱的宽带噪声,如粉色噪声和褐色噪声。
由噪声的概率密度函数可以将噪声分为高斯噪声、均匀噪声、脉冲噪声。
1.3图像恢复的意义
一般地,对图像进行处理的主要目的有三个方面:
(1)提高图像的视感质量,如进行图像的亮度、彩色变换,增强、抑制某些成分,对图像进行几何变换等,以改善图像的质量。
(2)提取图像中所包含的某些特征或特殊信息。提取的特征可以包括很多方面,如频域特征、灰度或颜色特征、边界特征、区域特征、纹理特征、形状特征、拓扑特征和关系结构等。
(3)图像数据的变换、编码和压缩,以便于图像的存储和传输。
而图像恢复是图像处理的重要组成部分。图像恢复是通过计算机处理,对质量下降的图像加以重建或恢复的处理过程。因摄像机与物体相对运动、系统误差、畸变、噪声等因素的影响,使图像往往不是真实景物的完善映像,此时就需要进行图像恢复处理。在图像恢复中,需建立造成图像质量下降的退化模型,然后运用相反过程来恢复原来图像,并运用一定准则来判定是否得到图像的最佳恢复。
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次的复原,迭代次数越多,去模糊的效果越好,可通过具体情况调整
z2=deconvlucy(z1,h,NUMIT,DAMPAR,WEIGHT);
axes(handles.axes3); %输出图像
imshow(z2); title('L-R算法恢复后的图像');
% 盲去卷积恢复,由于有迭代次数,显示图像速度较慢
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;%盲去卷积迭代的次数,需要依具体情况调试到适当的值
[z2,PSF]=deconvblind(z1,INITPSF,NUMIT,DAMPAR,WEIGHT);
axes(handles.axes3); %输出图像
imshow(z2); title('盲去卷积恢复后的图像');
%旋转
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('顺时针旋转45度的图像');
axes(handles.axes3);
imshow(c2); title('逆时针旋转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]阮秋琦等译.数字图像处理(MATLAB版).电子工业出版社,2005.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。