请问如何在matlab gui中一个轴内实现多个图像的拖动

请问如何在matlab gui中一个轴内实现多个图像的拖动

img

目前只能做到在一个轴内显示多个图像 但也不美观 添加工具栏编辑器也无法解决

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7581378
  • 你也可以参考下这篇文章:【验证码识别】基于matlab GUI不变矩验证码识别(带面板)【含Matlab源码 095期】
  • 除此之外, 这篇博客: 如何利用MATLAB提供GUI界面实现数字图像处理系统的设计中的 如何利用MATLAB提供GUI界面实现数字图像处理系统的设计 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在MATLAB用户界面GUI上设计一个操作简单、功能齐全的数字图像处理技术的集合,对于一些对数字图像处理原理不懂的用户也能够根据自己的需求处理处自己想要的数字图像。本系统GUI界面设计两个显示界面: 一个原数据界面,一个是处理结果界面显示,能够很好的展现数字图像处理结果。每一个功能的实现都是按钮代替了每一步复杂的数字图像处理过程。

    1. 主要包含两个步骤,分别如下:

    • 数字图像处理系统的MATLAB GUI设计

    GUI人机交互界面从上到下的,程序设计从下到上的原则来实现本课题的数字图像处理系统的功能集合。

    • MATLAB GUI人机交互界面的功能函数设计研究

    实现本系统对处理图像的读取和保存、撤销和还原、图像剪切、图像反色、图像旋转等修剪。设计GUI人机交互界面实现对图像添加噪声、图像滤波、边缘检测等处理功能的程序。

    • 最终实现界面如下所示

    MATLAB提供GUI界面实现数字图像处理系统的设计

    2. 以下附上本科时代学习笔记

    #基于matlab的图像处理系统设计
    1、设计目的

    利用matlab的GUI程序设计一个简单的图像处理系统,可以实现图像的简单的运算操作,实现图像的剪切、旋转、滤波、放缩等功能,进一步熟悉matlab语言。

    2、设计要求

    设计程序有以下基本功能:

    • 图像的读取和保存;
    • 图像剪切;
    • 图像发色;
    • 添加噪声:椒盐噪声,乘性噪声,高斯噪声等;
    • 图像的边沿检测;
    • 图像滤波:实现平滑滤波,锐化滤波;
    • 图像的旋转;
    • 实现图像操作的撤销和还原;
    • 最后完成整个系统完整,退出系统。

    3、设计的matlab数字图像处理系统框架

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9epg4MN-1600406381360)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\GUI1.JPG)]

    该GUI界面包含两个显示界面axes1和axes2。包含读取图像、椒盐噪声,乘性噪声,高斯噪声,保存图像,退出系统,剪切图像,图像反色,滤波,旋转,撤销和还原等按钮,构成了这个系统的框架。运行之后的界面显示如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mu89zV4f-1600406381361)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\GUI.JPG)]

    4、GUI各个模块功能的实现

    4.1、图像的读取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrF4Pw8C-1600406381364)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\select.JPG)]

    利用matlab的uigetfile获取图像的路径,msgbox窗口函数提示选择图像失败,imshow对图像的显示。

    global s  %定义全局变量,为了后面的还原保存数据
    [filename,pathname,filterindex]=...
    uigetfile({'*.*';'*.bmp';'*.tif';'*.png';'*.jpg';'*.jpeg'},'select picture');  %选择图片路径   
    str=[pathname filename];  %合成路径+文件名
    s=str;
    handles.filebig=filterindex;
    if filterindex==0
    msgbox('选择图像失败!','error');
    return
    else   
    im=imread(str);   %读取图片   
    end 
    axes(handles.axes1);  %使用第一个axes
    imshow(im);  %显示图片
    handles.img=im;
    guidata(hObject,handles);
    

    4.2、图像的保存

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwvohYwB-1600406381367)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\save.JPG)]

    图像保存利用matlab的uiputfile函数和IMwrite函数进行数据的写入。msgbox(‘参数1’,‘参数2’)实现窗口的界面。

    if handles.img==0
    msgbox('没有可保存的图像!','error');
    return;
    else
    [filename,pathname,filterindex]=...
    uiputfile({'*.bmp';'*.tif';'*.png';'*.jpg';'*.jpeg'},'save picture');%存储图片路径
    end
    if filterindex==0
    return  %如果取消操作,返回
    else
    str=[pathname filename];  %合成路径+文件名
    axes(handles.axes2);  %使用第二个axes
    imwrite(handles.img,str);  %写入图片信息,即保存图片
    end
    

    程序的主要部分是通过uiputfile函数选择图像的格式和路径,通过imwrite函数实现图像的保存,最后完成保存工作。通过之后的完善,参数handles.img=0时,表示没有图像可以保存,考虑其中的情况修复这种情况下的系统报错;另外filterindex=0时,按了保存按钮,但是没有保存这种情况,修复了保存的可能性。

    4.3、系统退出

    clc
    clear
    close(gcf)
    

    该部分利用clc清屏指令,clear清除内存,close(gcf)就是关闭当前窗口的指令。来实现系统的退出。

    4.4、图像反色

    利用反色函数imcomplement()实现图像的反色,可以反色彩色和灰色图像

     global T   %定义全局变量,保存上一个操作数据,实现撤销操作
     T=handles.img;
     axes(handles.axes1);
     imshow(handles.img);
     mysize=size(handles.img);
     I=imcomplement(handles.img);%还需要进一步修改。
     axes(handles.axes2);
    imshow(I);
    handles.img=I;
    guidata(hObject,handles);
    

    效果图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DV8d7Iqs-1600406381369)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\inv.JPG)]

    4.5、图像的剪切

    利用matlab的imcrop函数实现图像的剪切。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j2vUW4NO-1600406381370)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\imcrop.JPG)]

    global T    
    T=handles.img;    
     if handles.filebig==0
     msgbox('处理失败,请选择图像。','error');
     return;
     else
     axes(handles.axes1);
     imshow(handles.img);  
    I=imcomplement(handles.img);%还需要进一步修改。
     end
     axes(handles.axes2);
    imshow(I);
    handles.img=I;
    guidata(hObject,handles);
    

    4.6、加入噪声

    4.6.1、椒盐噪声

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVor3z2n-1600406381371)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\jiaoyan1.JPG)]

     global T  
     axes(handles.axes1);
     imshow(handles.img);
     T=handles.img;
     mysize=size(handles.img);
     if numel(mysize)<3
     msgbox('处理失败,请选择RGB图像。','error');
     return;
     else
    prompt={'输入椒盐噪声:'};
    defans={'0.02'};
    p=inputdlg(prompt,'input',1,defans);%prompt是提示语,input是对话框的标题,1是输入方框的大小设置,defans是输入框的默认值  
    p1=str2num(p{1});
    f=imnoise(handles.img,'salt & pepper',p1);  %由于调试出现各种错误提示,不知道什么情况,最后发现salt&pepper之间需要空格。
     end
     axes(handles.axes2);   
    imshow(f);
    handles.img=f;
    guidata(hObject,handles);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0M2GK7c1-1600406381372)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\jiaoyan2.JPG)]

    4.6.2、乘性噪声

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKMSs4Mh-1600406381373)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\chengxing1.JPG)]

    global T
    T=handles.img;
    axes(handles.axes1);
    imshow(handles.img);
     mysize=size(handles.img);
     if numel(mysize)<3
     msgbox('处理失败,请选择RGB图像。','error');
     return;
     else
    prompt={'输入乘性噪声:'};
    		defans={'0.02'};
    		p=inputdlg(prompt,'input',1,defans);
    		p1=str2num(p{1});
    
    		f=imnoise(handles.img,'speckle',p1);%speckle
     end
     axes(handles.axes2);
    		imshow(f);
    		handles.img=f;
    		guidata(hObject,handles);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZLA8RH1-1600406381374)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\chengxing2.JPG)]

    4.6.3、高斯噪声

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJFQflrq-1600406381375)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\gaosi1.JPG)]

    global T
    T=handles.img;
     mysize=size(handles.img);
     if numel(mysize)<3
     msgbox('处理失败,请选择RGB图像。','error');
     return;
     else
    axes(handles.axes1);
    imshow(handles.img);
    prompt={'输入高斯噪声1:','输入高斯噪声2:'};
    defans={'0','0.02'};
    p=inputdlg(prompt,'input',1,defans);
    p1=str2num(p{1});
    p2=str2num(p{2});
    f=imnoise(handles.img,'gaussian',p1,p2);
     end
     axes(handles.axes2);
    imshow(f);
    handles.img=f;
    guidata(hObject,handles);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gd0t75vw-1600406381376)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\gaosi2.JPG)]

    4.7、边缘检测

     global T
    if handles.filebig==0
    msgbox('请先输入图像!','error');
    return;
    else
    T=handles.img;
     axes(handles.axes1);
     imshow(handles.img);
    str=get(hObject,'string');  %拿到所选按钮的名称
    axes(handles.axes2);   %使用第二个axes
    mysize=size(handles.img);
    %判断读取的图像是彩色还是灰色图片,若是彩色图片进行灰度化,进一步进行边缘检测
    if numel(mysize)>2
    us=rgb2gray(handles.img);
    else
    us=handles.img;
    end
     switch str   %选择语句
    case'Graying'  %点击原图按钮
    BW=us;
    imshow(BW);  %显示原图
    handles.img=BW;
    guidata(hObject,handles);
    case'Roberts'  %点击Roberts边缘检测按钮
    BW=edge(us,'roberts');
    imshow(BW);
     handles.img=BW;
     guidata(hObject,handles);
    case'Sobel'  %点击Sobel边缘检测按钮
    BW=edge(us,'sobel');
    imshow(BW);
     handles.img=BW;
     guidata(hObject,handles);
    case'Prewitt'  %点击Prewitt边缘检测按钮
    BW=edge(us,'prewitt');
    imshow(BW);
     handles.img=BW;
     guidata(hObject,handles);
    case'Log'  %点击Log边缘检测按钮  
    BW=edge(us,'log');
    imshow(BW);
     handles.img=BW;
    %  handles.xiao=0;%........................................计数操作
     guidata(hObject,handles);
    case'Canny'  %点击Canny边缘检测按钮
    BW=edge(us,'canny');
    imshow(BW);
     handles.img=BW;
     guidata(hObject,handles);
    end;
    end;
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    4.8、图像旋转

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JIRnUkPy-1600406381383)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\旋转1.JPG)]

     global T
    if handles.filebig==0
    msgbox('请输入函数图像!','error');
    return;
    else
    T=handles.img;
    prompt={'输入旋转角度:'};
    		defans={'30'};
    		p=inputdlg(prompt,'input',1,defans);%prompt是提示语,input是对话框的标题,1是输入方框的大小设置,defans是输入框的默认值 
    if ~isempty(p)%判断inputdlg是否有返回值。进一步判断
    		p1=str2num(p{1});
    else
    return;
    end    
    end
    handles.im1=imrotate(handles.img,p1,'nearest','crop');%crop
    % guidata(hObject,handles);
    axes(handles.axes2);
    imshow(handles.im1);
    handles.img=handles.im1;
    guidata(hObject,handles);%需要保存数据不然后面的操作无法读取原来的数据,实现不了还原撤销操作。
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Plof5ZB-1600406381383)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\旋转2.JPG)]

    4.9、图像滤波操作

    4.9.1、平滑滤波

    按钮可以识别系统是否含有可操作图像,可以进行提示,不会发生错误。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84s3Umdg-1600406381384)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\平滑1.JPG)]

     global T
    if handles.filebig==0 %判断系统是否有处理文件
    msgbox('请输入函数图像!','error');
    return;
    else
     axes(handles.axes1);
     imshow(handles.img);
    T=handles.img;
    axes(handles.axes2);
    prompt={'请输入模板维度:'};
    defans={'3'};
    p=inputdlg(prompt,'input',1,defans);
    p1=str2num(p{1});
    h1=fspecial('average',[p1 p1]);
    I=imfilter(handles.img,h1);%线性空间滤波
    end
    imshow(I);
    handles.img=I;
    guidata(hObject,handles);
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i2jzMyA1-1600406381385)(G:\MATLAB\matlab_2015b\matlabworkspace\基于matlab的数字图像处理系统\平滑2.JPG)]

    4.9.2、锐化滤波

    4.9.2.1、sobel滤波

    global T
    if handles.filebig==0
    msgbox('请输入函数图像!','error');
    return;
    else
     axes(handles.axes1);
     imshow(handles.img);
    T=handles.img;
    axes(handles.axes2);
    h=fspecial('sobel');
    g2=imfilter(handles.img,h);
    g3=imadd(g2,handles.img);
    end
    imshow(g3);
    handles.img=g3;
    guidata(hObject,handles);
    

    4.9.2.2、prewitt滤波

    global T
    if handles.filebig==0
    msgbox('请输入函数图像!','error');
    return;
    else
     axes(handles.axes1);
     imshow(handles.img);
    T=handles.img;
    axes(handles.axes2);
    h=fspecial('prewitt');
    g2=imfilter(handles.img,h);
    g3=imadd(g2,handles.img);
    end
    imshow(g3);
    handles.img=g3;
    guidata(hObject,handles);
    

    4.9.2.3、laplacian滤波

    global T
    if handles.filebig==0
    msgbox('请输入函数图像!','error');
    return;
    else
     axes(handles.axes1);
     imshow(handles.img);
    T=handles.img;
    axes(handles.axes2);
    h=fspecial('laplacian');
    g2=imfilter(handles.img,h);
    g3=imadd(g2,handles.img);
    imshow(g3);
    end
    handlse.img=g3;
    guidata(hObject,handles);
    

    5.0、系统撤销与还原

    系统的还原是通过之前定义的全局变量s,通过按钮按键,从新读取最原始的数据,显示在axes2上,实现还原功能。

    global s
    if handles.filebig==0
    msgbox('请输入函数图像!','error');
    return;
    else
    im=imread(s);
    end
    axes(handles.axes2);
    imshow(im);
    handles.img=im;
    guidata(hObject,handles);
    

    系统撤销实现是通过全局变量,记录上一次操作结果,对上一次操作结果的显示,实现对操作的撤销功能。

    global T
    if handles.filebig==0
    msgbox('请输入函数图像!','error');
    return;
    else   
    handles.img=T;
    end
    axes(handles.axes2);
    imshow(T);
    guidata(hObject,handles);
    

    6、学习总结与归纳

    这次GUI图像处理系统的学习,主要是为了更好地学习matlab操作,对matlab有更好地了解。一开始确实很迷茫,不知道用matlab软件该怎么来做这个简易的系统,在查询了资料之后大概了解了怎么来处理这个问题的大概思路,就是利用matlab的GUI人机交互界面来实现这个面板,在每个按钮下面来实现每一个功能。先从上往下设计,程序是从下往上设计的思路,最后来完成这个功能集合。在实验的过程中,遇到了很多的问题,就是因为不熟悉matlab,自己有好多想法但是不知道怎么来实现,然后我自己还的去查找、复习那些调用函数。

    • msgbox():该函数是调用窗口提示。
    • 如何判断一个一个数字图像矩阵是一个RGB图像还是灰度图像:mysize=size(handles.img)读取图像矩阵的维数。numel(mysize)%numel函数是返回矩阵中的元素个数,来计算mysize中的个数。如果numel>2,那么矩阵是三维的,必定是一个RGB图像,这样就能够判定读取的图像是不是灰度图像了。
    • inputdlg函数语句的调用:input dialog box

    ANSWER=inputdlg(PORMPT)创建一个对话框,对cell array名字在pormpt里面定义。弹出一个名字为potmpt的cell array,输入值返回到answer。

    ANSWER = inputdlg(PROMPT,NAME) specifies the title for the dialog.

    ANSWER = inputdlg(PROMPT,NAME,NUMLINES) specifies the number of lines for each answer in NUMLINES.

    ANSWER = inputdlg(PROMPT,NAME,NUMLINES,DEFAULTANSWER) specifies the default answer to display for each PROMPT.Default Answer must be a cell array of strings.
    下面例子是有两个输入框,名字叫‘name’,‘只有一行输入框’,初始值在defaultanswer中定义。最后全部返回到answer中,实现数据传递。

       prompt={'Enter the matrix size for x^2:','Enter the colormap name:'};
       name='Input for Peaks function';
       numlines=1;
       defaultanswer={'20','hsv'};
       answer=inputdlg(prompt,name,numlines,defaultanswer);
       这是一个用于很好的人机交流界面,可以让用户自己很好的调试自己的产品窗口。
    
    • imread()函数是读取图像函数,生成matlab处理的矩阵

    在各个按钮功能完成之后,进行了程序bug的修复,当按钮没有传递数据时出现的报错进行了修复完善。之前系统不能还原和撤销,还不能对已经处理的图像再进行处理。在后面的修复中,通过全局变量T和s来分别保存上次操作变量,和最初读入图像来实现了系统操作的撤销和还原。可以重复累加的对图像进行处理。这样系统功能就更加完善。

    缺陷在于系统任然有的时候会出现报错,对剪切个位元素图像矩阵时出现报错。个别情况还原出现报错,还未能找到原因。不能实现撤销多级,应该利用多个全局变量保存操作图像就能实现撤销多级功能,这还有待修复。

  • 您还可以看一下 王海老师的MATLAB人脸定位识别系统【附GUI+源码】课程中的 人脸样本库的制作和训练小节, 巩固相关知识点