【图像分析】基于matlab小波变换图像分析【含Matlab源码 1365期】

·  阅读 761

一、小波变换图像分析简介

0 引言 21世纪是信息化时代,图像成为了人类获取信息的重要载体,在人类日常生活中扮演着越来越重要的角色,地位越来越高,例如,在线浏览、下载图像和视频、医院根据MRI(核磁共振图像)诊断疾病。但在图像产生以及传输等过程中,会遭到设施、环境等要素的干扰,导致图像信息的破坏或丢失[1,2]。阻碍人的视觉或系统传感器对所接收信源信息进行理解的各种因素就叫做噪声。在图像采集和传输过程中,往往会遭到各种噪声的污染。噪声的产生会很大程度上降低原始图像的分辨率,使原始图像变得模糊难以用与日常的生活或者研究,严重影响后续的一系列高级数字图像处理。

因此,如何将图像在采集以及传输过程后的噪声进行消除就变得非常重要。然而,传统的图像去噪方法在降低噪声和保留图像细节方面的确难以令人满意。小波变换在高频段可以用低频分辨率分析信号,并在不同的空间上进行分析。基于小波理论的数字信号处理已经取得了蓬勃的发展,提供了一种全新的强劲信号处理手段。理所当然的将小波变换用于图像降噪中。

1 研究意义以及发展过程 基于小波变换的图像去噪主要是由小波域中的小波阈值处理完成。小波域图像去噪处理可被认为是对输入图像的最佳估计使用阈值的噪声数据。其结构图如图1所示。 在这里插入图片描述 图1 小波去噪结构框图 小波理论在图像去噪中应用的发展过程大致上可以分成三个阶段:第一阶段,Mallat提出了非常著名的基于小波系数模极大值的去噪方法。第二阶段,在以斯坦福大学的Donoho和Johnstone提出的一系列基于理论研究的小波阈值去噪方法。第三阶段,在各种模型的发展下,该阶段的主要特点是根据图像小波系数,通过图像小波系数的多尺度统计建模,对层内和层间存在的相关性进行去噪。 在这里插入图片描述 图2.a灰度图 在这里插入图片描述 图2.b一次离散小波变换图 在这里插入图片描述 图2.c一次逆离散小波变换图 图像是一个二维函数f(x,y),其中x和y是平面坐标,振幅在任何一对坐标(x,y)称为灰度级或强度那个时候的图。有两种类型的图像,即灰色缩放图像和RGB图像。图像在获取和传输中常常会被噪声破坏。有各种降噪技术被使用用于消除噪音。大多数使用的标准算法去噪图像并执行个体过滤过程。去噪通常会降低噪音水平但由于图像模糊或过度平滑边缘或线条等损失。近年来出现了大量关于小波阈值的研究和图像去噪的阈值部分,因为小波为分离噪声信号提供了适当的基础图像信号。小波变换擅长能量压实,小系数更有可能是由于重要的信号特征而产生的噪声和大系数。这些小系数可以在没有阈值的情况下进行阈值处理影响图像的重要特征。

2 技术实验以及分析 小波变换(WT)是信号分析的有力工具在处理多分辨率的场景下不像傅里叶变换,小波变换适用于应用具有瞬态的非平稳信号现象,其中频率响应随时间变化。小波系数表示相似度的度量信号和所选小波之间的频率成分功能。这些系数计算为信号和缩放小波函数的卷积,这可以解释为扩张的带通滤波器,因为其带通样频谱。通过小波分析从一个高尺度的信号,提取的全局信息称为近似值,并在两个尺度上,提取精细信息称为详细信息。 在这里插入图片描述 图5.c小波阈值去噪图像

离散小波变换(DWT)需要更少的空间利用节省空间的编码小波是正交或双正交基,并且因此不会产生多余的分析。离散的小波变换对应其连续版本通常在二元网格上采样。阈值化一次对一个小波系数进行运算,是一种简单的非线性技术。在其最基本形式,每个系数将与阈值进行比较。如果系数小于阈值然后将它设置为零,否则将保留或修改。

连续小波在处理对象时会造成理论对象的系数冗余,在实际应用中我们所需要在除去干扰信号的同时保有原始信号的低冗余性,因为离散的小波变换与连续的小波变换运算相比更加的便捷,且在实际的信号处理上计算机储存的都是离散信息。因此需要对尺寸参数和平移量参数离散处理,将原有的连续平移伸缩分量变换[7]。

如2图所示将lena图进行离散化,图2.a为灰度图像、图2.b一次离散小波变换图像、图2.c一次逆离散小波变换图像。

图3.a为灰度图像、图3.b为两次离散小波变换图像、图3.c为二次逆离散小波变换图像。

利用小波变换对图像进行去噪就是将有噪声的小波系数进行分解,然后从纯图像中计算出无限接近的小波系数值,噪声图像经过小波系数分解处理。小波系数由两部分组成分别是纯小波系数和噪声小波系数。两部分系数的和就是含噪图像分解的小波系数,而使用阈值对带噪图像的处理,就是阈值后的小波系数也叫作阈值函数。这样可以在最大限度上处理噪声,得到更加纯净的利用小波系数重构的图像。算法流程图如图4所示。 在这里插入图片描述 图4 小波阈值去噪基本流程图 算法实现后的图像如图所示,图5.a为灰度图像,图5.b为加入高斯噪声的图像,图5.c为小波软阈值去噪之后的图像。将灰度图像原图、加入高斯噪声的图像与降噪后的图像进行对比,降噪效果显而易见。

阈值函数在小波变换中对于图像降噪起到的作用就是系数选择,通过阈值对于高频小波系数进行处理,在阈值化中加入阈值函数表达式。在基于小波阈值去噪方法中,其中阈值的确定决定了去噪后的图像质量的好坏,对去除噪声的效果有着很大的影响。本实验选取的是软阈值函数,其数学表达式如下。 在这里插入图片描述 其中:y为含噪声信号的小波变化系数;T为去噪阈值;Tsoft为软阈值滤波的收缩函数;sgn(y)为符号函数。

软阈值滤波将幅值大于阈值的小波系数收缩且保留下来,软阈值的收缩函数的优点就是连续性好。

小波去噪还包括模极大值重构滤波方法。优点是它不像小波阈值去噪那样提前估计噪声的方差,但是它要使用到模极大值重构小波系数,这就导致大大增加的计算量,而且该方法降噪效果并不好,所以使用受到限制。

还有空域滤波方法,该方法利用小波系数尺度之间的相关性进行去噪,虽然原理简单,但是运算过程中需要进行多次迭代,这就也使得计算量大大增加,在图像去噪方面也不能广泛使用。

二、部分源代码

function varargout = wavelet(varargin)
% WAVELET MATLAB code for wavelet.fig
%      WAVELET, by itself, creates a new WAVELET or raises the existing
%      singleton*.
%
%      H = WAVELET returns the handle to a new WAVELET or the handle to
%      the existing singleton*.
%
%      WAVELET('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in WAVELET.M with the given input arguments.
%
%      WAVELET('Property','Value',...) creates a new WAVELET or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before wavelet_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to wavelet_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help wavelet

% Last Modified by GUIDE v2.5 10-Jan-2021 05:42:48

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @wavelet_OpeningFcn, ...
                   'gui_OutputFcn',  @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 wavelet is made visible.
function 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 wavelet (see VARARGIN)

% Choose default command line output for wavelet
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes wavelet wait for user response (see UIRESUME)
% uiwait(handles.figure_wavelet);
setappdata(handles.figure_wavelet,'img_src',0)           %初始化变量到窗口框架
setappdata(handles.figure_wavelet,'WAVELET_NAME',0);
setappdata(handles.figure_wavelet,'Filter_style',0);
setappdata(handles.figure_wavelet,'Image_R',0);

% --- Outputs from this function are returned to the command line.
function varargout = 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 Import_image.
function Import_image_Callback(hObject, eventdata, handles)
% hObject    handle to Import_image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile( ...
    {'*.bmp;*,jpg;*.png;*.jpeg;*.tif','Image File(*.bmp,*.jpg,*.png,*jpeg,*.tif)';...
    '*.*',        'All File(*.*)'},...
    'Pick an image');
    axes(handles.axes_original);      %用axes命令设定当前操作的坐标轴是axes_src
    fpath = [pathname  filename];     %将文件名和目录名组合成一个完整的路径
    img_src = imread(fpath);          %读取图片

    imshow(img_src);                   %用imread读入图片,并用imshow在axes_src上显示
    setappdata(handles.figure_wavelet,'img_src',img_src);

% --- Executes on button press in analyze_image.
function analyze_image_Callback(hObject, eventdata, handles)
% hObject    handle to analyze_image (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%Main

img_src = getappdata(handles.figure_wavelet,'img_src');
%[ X,map] = rgb2ind( img_src, 256);%把RGB图转化为索引图像,得到颜色矩阵map
%save '00' X map; load 00;
%colormap( map);
HANDDLE_IMAGE = img_src;
%image(HANDDLE_IMAGE);


%**********************************************************************%
%             二、选择小波的基波,计算出相关的滤波函数
%**********************************************************************%
WAVELET_NAME = getappdata(handles.figure_wavelet,'WAVELET_NAME');
%WAVELET_NAME = 'sym8';
[Lo_D,Hi_D,Lo_R,Hi_R]=wfilters(WAVELET_NAME);
RowLo_DTemp = RanksSampling(RanksConv(HANDDLE_IMAGE,Lo_D,'r'),'c',2);

%**********************************************************************%
%             三、分解
%**********************************************************************%
CA = RanksSampling(RanksConv(RowLo_DTemp,Lo_D,'c'),'r',2);
RowLo_DTemp = RanksSampling(RanksConv(HANDDLE_IMAGE,Lo_D,'r'),'c',2);
CA = RanksSampling(RanksConv(RowLo_DTemp,Lo_D,'c'),'r',2);
CH = RanksSampling(RanksConv(RowLo_DTemp,Hi_D,'c'),'r',2);
RowHi_DTemp = RanksSampling(RanksConv(HANDDLE_IMAGE,Hi_D,'r'),'c',2);
CV = RanksSampling(RanksConv(RowHi_DTemp,Lo_D,'c'),'r',2);
CD = RanksSampling(RanksConv(RowHi_DTemp,Hi_D,'c'),'r',2);
%[CA,CH,CV,CD] = dwt2(HANDDLE_IMAGE,WAVELET_NAME);
axes(handles.axes_CA);
image(CA);
axes(handles.axes_CH);
image(CH);
axes(handles.axes_CV);
image(CV);
axes(handles.axes_CD);
image(CD);
%**********************************************************************%
%             四、去噪
%**********************************************************************%

Filter_style = getappdata(handles.figure_wavelet,'Filter_style');    
newCA =CA;
if(2 == Filter_style)

    [THR,SORH,KEEPAPP]=ddencmp('den','wv',CH);%获取去噪过程中的默认阈值(软或硬)
    newCH=wdencmp('gbl',CH,WAVELET_NAME,2,THR,SORH,KEEPAPP);
    [THR,SORH,KEEPAPP]=ddencmp('den','wv',CV);%获取去噪过程中的默认阈值(软或硬)
    newCV=wdencmp('gbl',CV,WAVELET_NAME,2,THR,SORH,KEEPAPP);%用全局阈值对图像去噪
    [THR,SORH,KEEPAPP]=ddencmp('den','wv',CD);%获取去噪过程中的默认阈值(软或硬)
    newCD=wdencmp('gbl',CD,WAVELET_NAME,2,THR,SORH,KEEPAPP);%用全局阈值对图像去噪
end
if(3 == Filter_style)
    %下面用独立阈值选项进行图像的消噪
    thr_h=[96.245,97.411];%水平方向阈值
    thr_v=[99.321,94.122];%垂直方向阈值
    thr_d=[95.762,92.330];%对角方向阈值
    thr1=[thr_h;thr_v;thr_d];%三维矩阵,长度为N
    newCH=wdencmp('lvd',CH,WAVELET_NAME,2,thr1,'s');%选择软阈值
    newCV=wdencmp('lvd',CV,WAVELET_NAME,2,thr1,'s');
    newCD=wdencmp('lvd',CD,WAVELET_NAME,2,thr1,'s');
end
    
    
    axes(handles.axes_newCA);
    image(newCA);
    axes(handles.axes_newCH);
    image(newCH);
    axes(handles.axes_newCV);
    image(newCV);
    axes(handles.axes_newCD);
    image(newCD);

%**********************************************************************%
%             五、重构
%**********************************************************************%
CA_Temp = RanksInterpolation(newCA,'r',2);
CH_Temp = RanksInterpolation(newCH,'r',2);
CloumnTemp1 = RanksConv(CA_Temp,Lo_R,'c')+RanksConv(CH_Temp,Hi_R,'c');
CV_Temp = RanksInterpolation(newCV,'r',2);
CD_Temp = RanksInterpolation(newCD,'r',2);
CloumnTemp2 = RanksConv(CV_Temp,Lo_R,'c')+RanksConv(CD_Temp,Hi_R,'c');

CloumnTempA = RanksInterpolation(CloumnTemp1,'c',2);
CloumnTempB = RanksInterpolation(CloumnTemp2,'c',2);
RowTemp = RanksConv(CloumnTempA,Lo_R,'r')+RanksConv(CloumnTempB,Hi_R,'r');

Image_R =wkeep(RowTemp,size(HANDDLE_IMAGE),'c');   %提取向量和矩阵的部分

axes(handles.axes_worked);
image (Image_R)

setappdata(handles.figure_wavelet,'Image_R',Image_R);
%HANDDLE_IMAGE = img_src;     %为避免后续程序中误用X故用自定义变量替代
%image(HANDDLE_IMAGE);
  %  imshow(X);            %用imread读入图片,并用imshow在axes_src上显示
  
% WAVELET_NAME = 'sym8';
%[Lo_D,Hi_D,Lo_R,Hi_R]=wfilters(WAVELET_NAME);
%RowLo_DTemp = RanksSampling(RanksConv(HANDDLE_IMAGE,Lo_D,'r'),'c',2);
%CA = RanksSampling(RanksConv(RowLo_DTemp,Lo_D,'c'),'r',2);
%subplot(221);image(CA);colormap(map);title('Lo_D低通分解后的图像CA')%画出CA的图像


% --- 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 = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu1





% --- Executes on selection change in wavelet_style.
function wavelet_style_Callback(hObject, eventdata, handles)
% hObject    handle to wavelet_style (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns wavelet_style contents as cell array
%        contents{get(hObject,'Value')} returns selected item from wavelet_style
WAVELET_NAME = 'haar';
val = get(handles.wavelet_style,'Value');      %获取下拉框的值
switch val                                     %选择小波
    case 1                         
        WAVELET_NAME = 'haar'
    case 2 
        WAVELET_NAME = 'db2';
    case 3 
        WAVELET_NAME = 'db4';
    case 4 
        WAVELET_NAME = 'db6';
    case 5 
        WAVELET_NAME = 'db8';
    case 6 
        WAVELET_NAME = 'db10';
    case 7 
        WAVELET_NAME = 'sym2';
    case 8 
        WAVELET_NAME = 'sym4';
    case 9 
        WAVELET_NAME = 'sym6';
    case 10 
        WAVELET_NAME = 'sym8';
    case 11 
        WAVELET_NAME = 'sym10';
    case 12 
        WAVELET_NAME = 'coif1';
    case 13 
        WAVELET_NAME = 'coif3';
    case 14 
        WAVELET_NAME = 'coif5';
    case 15 
        WAVELET_NAME = 'dmey'
    case 16 
        WAVELET_NAME = 'haar'
end
setappdata(handles.figure_wavelet,'WAVELET_NAME',WAVELET_NAME);

% --- Executes during object creation, after setting all properties.
function wavelet_style_CreateFcn(hObject, eventdata, handles)
% hObject    handle to wavelet_style (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in filter_style.
function filter_style_Callback(hObject, eventdata, handles)
% hObject    handle to filter_style (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns filter_style contents as cell array
%        contents{get(hObject,'Value')} returns selected item from filter_style
Filter_style  = get(handles.filter_style,'Value');
setappdata(handles.figure_wavelet,'Filter_style',Filter_style);

% --- Executes during object creation, after setting all properties.
function filter_style_CreateFcn(hObject, eventdata, handles)
% hObject    handle to filter_style (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



% --------------------------------------------------------------------
function m_thanks_Callback(hObject, eventdata, handles)
% hObject    handle to m_thanks (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
h = thanks;

% --------------------------------------------------------------------
function m_about_Callback(hObject, eventdata, handles)
% hObject    handle to m_about (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
h = about;

复制代码

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本 2014a

2 参考文献 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020. [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013. [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013. [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015. [5]韩天奇,杨文杰,赵建光.基于小波变换阈值图像去噪分析[J].软件. 2021,42(06)

分类:
人工智能
标签:
分类:
人工智能
标签:
收藏成功!
已添加到「」, 点击更改