当前位置 博文首页 > 早知晓的博客:基于灰度信息(块匹配)的图像拼接系统——MATLAB

    早知晓的博客:基于灰度信息(块匹配)的图像拼接系统——MATLAB

    作者:[db:作者] 时间:2021-07-30 08:49

    基于灰度信息的图像拼接简介

    基于灰度相关的匹配是在待定点为中心的窗口内,以图像的灰度分布为匹配的内容,故称之为灰度匹配。又因为匹配是以划分的图像块为单位进行的,所以又称为块匹配(Block Matching)。这类算法的性能主要取决于相似性度量准则及搜索策略的选择。相似性度量是指用什么度量来确定待匹配特征之间的相似性,它通常定义为某种代价函数或者距离函数的形式。经典的相似性度量包括灰度差的绝对值平方和(SSD)、灰度差的绝对值和(SAD)和相关函数等。匹配窗口大小的选择是基于灰度相关的匹配方法必须考虑的问题,大窗口在遮挡或景物深度不连续的情况下会出现误匹配,小窗口不能覆盖足够的强度变化,因此自适应调整匹配窗口的大小可达到较好的效果。基于图像灰度信息的匹配方法比较直观,容易实现,并且具有以下优点:

    1. 不需要额外计算抽取图像的特征,可以避免由于特征抽取所引入的参数估计误差;
    2. 可以很好地处理具有丰富纹理特征的区域,而基于特征的匹配算法对具有较强纹理的图像处理效果较差。
    3. 它所利用的信息量是最大的,区分不同对象的能力强、精度高,特别是在十分复杂的图像环境和要求高精度的应用领域仍能够有效地工作。

    然而,图像的灰度值通常会受到光照的影响,非线性的不均匀光照会造成最终结果的较大偏差。同时,图像的比例变化、旋转、遮挡等都会影响匹配效果。此外,基于灰度信息的匹配计算量大,很难达到实时性要求。

    程序实现

    下面开始介绍基于灰度信息的图像拼接系统。

    一、选择待拼接图像文件夹并显示功能

    图形交互界面中设置了“选择文件夹”按钮。当点击该按钮时,会调用图像文件夹处理子程序 File_Process。当用户所选择的待拼接图像数量少于两张时,会有 msgbox 对话框提示用户“请选择至少两幅图像!”;当用户所选择的待拼接图像多于两张时,会将第一幅待拼接图像作为图像序列一,剩余所有图像作为图像序列二。当用户选择完待拼接图像文件夹后,会将待拼接图像通过 imread 函数读入软件系统,并保存在 handles 元胞数组中。同时,在窗口中显示待拼接图像,从而实现待拼接图像的导入及显示功能。

    代码如下:

    % --- 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)
    % “选择文件夹”按钮的回调函数,弹出文件夹打开对话框,选择待拼接图片
    
    % 初始化四个坐标轴属性,清空图片,恢复到系统初始化状态
    axes(handles.axes1); cla reset; box on; set(gca, 'XTickLabel', [], 'YTickLabel', []);
    axes(handles.axes2); cla reset; box on; set(gca, 'XTickLabel', [], 'YTickLabel', []);
    axes(handles.axes3); cla reset; box on; set(gca, 'XTickLabel', [], 'YTickLabel', []);
    axes(handles.axes4); cla reset; box on; set(gca, 'XTickLabel', [], 'YTickLabel', []);
    
    % 清空axes1,axes2,上一次拼接的结果以及拼接完的图片
    handles.file = [];
    handles.MStitch = [];
    handles.grayResult = [];
    handles.RGBResult = [];
     
    dname = uigetdir('.\\images', '请选择待拼接图像文件夹:');
    % folder_name =uigetdir(start_path,dialog_title) 
    % start_path为默认的路径,dialog_title为对话框名称,returns the directory name as a string. 
    
    if dname == 0          %异常处理
        return;
    end
    df = ls(dname);
    if length(df) > 2
        for i = 1 : size(df, 1)
            if strfind(df(i, :), '.db');
                df(i, :) = [];
                break;
            end
        end
        if length(df) > 2
            filename = fullfile(dname, df(end, :));
            pathname = [dname '\'];
        else
            msgbox('请选择至少两幅图像!', '提示信息', 'warn');
            return;
        end
    else
        msgbox('请选择至少两幅图像!', '提示信息', 'warn');
        return;
    end
    %图片序列处理
    file = File_Process(filename, pathname);
    if length(file) < 2
        msgbox('请选择至少两幅图像!', '提示信息', 'warn');
        return;
    end
    Img1 = imread(file{1}); 
    Img2 = ImageList(file); 
    axes(handles.axes1);
    imshow(Img1); title('图像序列1');
    axes(handles.axes2);
    imshow(Img2); title('图像序列2');
    
    handles.Img1 = Img1;
    handles.Img2 = Img2;
    handles.file = file;
    guidata(hObject, handles);
    

    效果图如下:
    在这里插入图片描述
    在这里插入图片描述

    二、图像匹配功能

    当用户点击“图像匹配”按钮时,软件会先判断 handles.file 是否为空,若为空,证明用户未进行待拼接图像导入步骤,msgbox 会提示“请先载入图像!”。

    代码如下:

    function pushbutton7_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton7 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % “图像匹配”按钮的回调函数,完成图像匹配,显示信息对话框。
    
    if isempty(handles.file)
        msgbox('请先载入图像!', '提示信息', 'modal');
        return;
    end
    if ~isempty(handles.MStitch)
        msgbox('图像匹配已完成!', '提示信息', 'modal');
        return;
    end
    
    file = handles.file;
    im1 = imread(file{1});
    MStitch.imrgb1 = double(im1); 
    im1 = rgb2gray(im1);
    MStitch.im1 = double(im1); 
    [Pheight, Pwidth] = size(im1);
    MStitch.Pwidth = Pwidth; 
    MStitch.Pheight = Pheight; 
    MStitch.W_min = round(0.60*Pwidth);
    MStitch.W_max = round(0.83*Pwidth); 
    MStitch.H_min = round(0.98*Pheight); 
    MStitch.minval = 255;
    im2 = imread(file{2});
    MStitch.imrgb2 = double(im2);
    im2 = rgb2gray(im2);
    im2 = double(im2);
    MStitch.im2 = double(im2);
    [W_box, H_box, bdown, MStitch] = Fun_Match(im2, MStitch);
    msgbox('图像匹配完成!', '提示信息', 'modal');
    handles.W_box = W_box;
    handles.H_box = H_box;
    handles.bdown = bdown;
    handles.MStitch = MStitch;
    guidata(hObject, handles);
    

    效果图如下:
    在这里插入图片描述

    三、图像拼接功能

    若用户点击“图像拼接”按钮,系统会自动对待拼接图像进行拼接处理。当需要拼接的图像数量大于2张时,程序会按照两张一次的顺序完成配准,直到做完所有导入图像的配准工作。之后,系统会采用渐入渐出法对配准后的图像进行融合处理。同样地,当待拼接图像数量大于2张时,程序会按照两张一次的顺序进行融合,直到完成所有图像的融合。至此,航拍图像的拼接工作完成,msgbox 会提示“图像拼接完成!”,并将拼接结果图像显示在窗口上。

    代码如下:(由于篇幅有限,仅展示灰度图像拼接代码,彩色图像拼接原理相同)

    % --- Executes on button press in pushbutton2.
    function pushbutton2_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    if isempty(handles.file)
        msgbox('请先载入图像!', '提示信息', 'modal');
        return;
    end
    if isempty(handles.MStitch)
        msgbox('请先进行图像匹配!', '提示信息', 'modal');
        return;
    end
    if ~isempty(handles.grayResult)
        msgbox('灰度拼接图像已完成!', '提示信息', 'modal');
        return;
    end
    if length(handles.file)
        [MStitch, result] = GrayMain_Process(handles.MStitch, ...
            handles.W_box, handles.H_box, handles.bdown);
    end
    grayResult = im2uint8(mat2gray(result));
    axes(handles.axes3); cla reset; box on; set(gca, 'XTickLabel', [], 'YTickLabel', []);
    imshow(grayResult, []);
    title('灰度图像拼接结果');
    
    handles.grayResult = grayResult;
    guidata(hObject, handles);
    
    msgbox('灰度拼接图像完成!', '提示信息', 'modal');
    

    效果图如下:
    在这里插入图片描述

    四、显示拼接图像功能

    在完成图像拼接后,为了方便用户对结果图进行观察和对比,程序界面上有“显示拼接图像”按钮,用于在二级界面上显示拼接后的航拍图像。若用户点击该按钮,程序会先判断 handles.result是否为空,若为空,证明目前没有拼接完成的图像,则会有 msgbox 提示用户“没有进行图像拼接!请先进行图像拼接。”;否则的话,则将已拼接完成的航拍图像显示在二级窗口界面上。

    代码如下:

    % --- Executes on button press in pushbutton4.
    function pushbutton4_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton4 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % “显示拼接图像”按钮的回调函数,弹出信息提示对话框,显示已拼接图像
    
    if isempty(handles.RGBResult)
        msgbox('没有进行图像拼接!请先进行图像拼接。', '提示信息', 'error');
        return;
    end
    
    if ~isempty(handles.RGBResult)
        figure(1);imshow(handles.RGBResult, []);
        title('图像拼接结果');
    end
    
    if ~isempty(handles.RGBListResult)
        figure(2); imshow(handles.RGBListResult, []);
        title('序列图像拼接结果');
    end
    

    效果图如下:
    在这里插入图片描述

    五、保存拼接图像功能

    若用户想要储存拼接后的图像,可通过单击“保存拼接图像”按钮进行存储。系统会弹出保存窗口,默认在当前路径下对拼接后的图像进行保存,用户可自命名图像名称,选择常用的图像文件格式,也可更改保存路径,程序利用 imwrite 函数将图像进行保存,并会利用 msgbox 提示用户“保存拼接图像成功!”。

    代码如下:

    % --- Executes on button press in pushbutton6.
    function pushbutton6_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton6 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % “保存拼接图像”按钮的回调函数,弹出信息提示对话框,保存已拼接图像
    
    if isempty(handles.RGBResult)
        msgbox('没有进行图像拼接!请先进行图像拼接!', '提示信息', 'error');
        return;
    end
    [filename, pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
        '*.*','All Files' }, '保存拼接结果图像', ...
        'Result\result.jpg');
    if isequal(filename, 0)
        return;
    end
    [pathstr, name, ext] = fileparts(filename);
    
    if ~isempty(handles.RGBResult)
        file = fullfile(pathname, [name, ext]);
        imwrite(handles.RGBResult, file);
    end
    
    if ~isempty(handles.RGBListResult)
        file = fullfile(pathname, [name, '_List', ext]);
        imwrite(handles.RGBListResult, file);
    end
    
    msgbox('保存拼接图像成功!', '提示信息', 'modal');
    

    效果图如下:
    在这里插入图片描述

    六、退出系统功能

    当用户完成以上所有操作想要退出系统时,可通过点击“退出系统”按钮退出本系统,并清空和关闭所有软件界面及暂时寄存的变量。在退出前会有 questdlg 对话框询问用户“您确定要退出无人机航拍图像拼接系统?”,有“退出”和“取消”两个选项供用户进行选择,默认选项是取消。

    代码如下:

    % --- Executes on button press in pushbutton8.
    function pushbutton8_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton8 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % “退出系统”按钮的回调函数,弹出问题提示对话框,选择是否退出系统
    
    choice = questdlg('您确定要退出无人机航拍图像拼接系统?', ...
        '退出选项', ...
        '退出', '取消', '取消');
    switch choice
        case '退出'
            close all;
        case '取消'
            return;
    end
    

    效果图如下:
    在这里插入图片描述

    总结

    博主自已测试了基于灰度信息的图像配准方法以后觉得该方法实现简单,适合图像变换程度较小的情况,若待拼接图像是旋转变换等,则拼接图像精度低,容易出现误匹配现象,并且计算时间长,计算速度慢,无法满足实时处理。

    所以如果想要实现快速、准确拼接,需要选择基于特征的图像配准方法。但是对于初步学习图像拼接的小伙伴,该系统还是很好的。

    完整代码请自行下载呦或者百度网盘下载也可,小伙伴们有什么问题可以评论区留言哦,欢迎交流。


    版权说明
    文章作者:早知晓
    博文链接:Click here
    希望大家都走在开满鲜花的路上,加油鸭~


    cs