2017-06-08 14:17:21 jidushanzhu 阅读数 11084
  • Python可视化界面编程课程 PyQt5实战网课 GUI在线视频...

    课程概述 本课程主要针对PyQT5中的界面部分(GUI)进行学习,分为三部分,包括初级GUI编程、进阶GUI编程和GUI编程实战。 初级GUI编程:从介绍编程环境搭建开始,然后分析最基础的单个窗口框架,接着介绍QT Designer,最后结合实例详细分析基本控件的使用。 进阶GUI编程:主要包括高级界面控件分析、布局管理介绍、信息与槽分析、图形与特效和扩展应用。 GUI编程实战:经典程序开发和微信好友数据分析。 本课程共55节课时,除前两节介绍和安装的课时外,其它每节课都有编程实例,购买本视频教程后,赠送的资料包括课程配套PPT和源码等,入群有老师提供在线解答学习中遇到的问题。 客服QQ群:671935288 请联系客服微信号:18958869699,加入微信群

    56318 人正在学习 去看看 林男

简单的界面实现的几个简单的功能,只支持JPG格式图像,还有很多需要改进的。


1、灰度化:提取jpg图像各个像素点的R、G、B三个类型的值,再对其进行加权平均。最后得到一个通道红绿蓝三个类型的加权平均。
公式为:ima=0.299*ima_red+0.587*ima_green+0.114*ima_blue。


2、二值化:二值化是在图像灰度化的基础上进行的,通过比较图像每个像素点的灰度值与阈值的大小关系来设置该点为0或1。


3、中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗口移动时,利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。本系统中值滤波设置的核为长宽都是6的正方形,在此邻域内来找中值。

4、低通滤波:在低通滤波中,低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。首先对图像进行傅里叶变换,接着将FFT的DC分量移到频谱中心,指定滤波器截止频率和滤波半径后,通过低通滤波转换函数与该频率进行比较d=sqrt((i-n1)^2+(j-n2)^2)。若信号大于该频率,则置为0。


5、均值滤波:均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个滤波核,该核包括了其周围的临近像素,再用核中的全体像素的平均值来代替原来像素值。在本项目中,需先给出设计的正方形核的边长,之后便可以用指定大小的滤波核进行均值滤波。

6、高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值用。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

7、形态学-腐蚀:一般腐蚀操作对二值图进行处理,腐蚀操作如左图,当像素点(i,j+1)和(i+1,j)为1时则(i,j)为1。腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的目标物。如果两目标物间有细小的连通,可以选取足够大的结构元素,将细小连通腐蚀掉。

8、直方图统计:灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域。

9、sobel:图像的边缘是灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。由于只采用2个方向的模板。

10、canny:Canny检测主要分为四个步骤。首先为防止噪声干扰,先对图像进行去噪。接着可按照sobel的方式来计算图像梯度的幅值和方向。由于梯度大的不一定就是边缘,可以通过每个像素点的方向来确定该像素点在此邻域范围内是否是最大值,若是,则保留该像素点,不是则舍弃。最后用双阈值法再剔除一部分像素点并连接边缘。


程序下载:http://download.csdn.net/detail/jidushanzhu/9864612


2017-04-10 18:18:49 dingkeyanlail 阅读数 5718
  • Python可视化界面编程课程 PyQt5实战网课 GUI在线视频...

    课程概述 本课程主要针对PyQT5中的界面部分(GUI)进行学习,分为三部分,包括初级GUI编程、进阶GUI编程和GUI编程实战。 初级GUI编程:从介绍编程环境搭建开始,然后分析最基础的单个窗口框架,接着介绍QT Designer,最后结合实例详细分析基本控件的使用。 进阶GUI编程:主要包括高级界面控件分析、布局管理介绍、信息与槽分析、图形与特效和扩展应用。 GUI编程实战:经典程序开发和微信好友数据分析。 本课程共55节课时,除前两节介绍和安装的课时外,其它每节课都有编程实例,购买本视频教程后,赠送的资料包括课程配套PPT和源码等,入群有老师提供在线解答学习中遇到的问题。 客服QQ群:671935288 请联系客服微信号:18958869699,加入微信群

    56318 人正在学习 去看看 林男

整理电脑时,发现了本科时做的一个matlab GUI,关于图像处理的一些基本操作,里面有挺多功能的,看下面的图片。

图像类型转化,几何运算,图像变换,添加噪声,图像复原,图像增强,图像分割,形态学处理,小波变换,和几个应用。内部源程序主要来源于——Matlab数字图像处理(张德丰第二版)。我把源文件传上来了,欢迎下载试用,有一些Bug,见谅,毕竟本科时候做的。

链接地址:http://download.csdn.net/detail/dingkeyanlail/9809796

2015-11-26 21:46:10 qq_15096707 阅读数 7965
  • Python可视化界面编程课程 PyQt5实战网课 GUI在线视频...

    课程概述 本课程主要针对PyQT5中的界面部分(GUI)进行学习,分为三部分,包括初级GUI编程、进阶GUI编程和GUI编程实战。 初级GUI编程:从介绍编程环境搭建开始,然后分析最基础的单个窗口框架,接着介绍QT Designer,最后结合实例详细分析基本控件的使用。 进阶GUI编程:主要包括高级界面控件分析、布局管理介绍、信息与槽分析、图形与特效和扩展应用。 GUI编程实战:经典程序开发和微信好友数据分析。 本课程共55节课时,除前两节介绍和安装的课时外,其它每节课都有编程实例,购买本视频教程后,赠送的资料包括课程配套PPT和源码等,入群有老师提供在线解答学习中遇到的问题。 客服QQ群:671935288 请联系客服微信号:18958869699,加入微信群

    56318 人正在学习 去看看 林男

自定义简易图像处理系统:综合此前内容得出该系统,系统功能包括:图像简单处理、图像的灰度变换、图像直方图均衡化和比特平面分层、空间域滤波、频率域滤波、彩色图像的空间域滤波。界面如图1


图 1

功能方向选择使用下拉列表的方式,通过选择下拉列表中的某一项,下拉列表下面的区域就会显示对应的功能模块。如图23

图 2


图 3

该系统的使用:首先是点击读入图像,通过下拉列表选择对应的功能模块,在功能模块中选择所需的功能,按照要求输入对应所需的参数。最后点击“处理图像”,即可输出显示结果。如图4


图 4

还可点击“保存”,保存输出结果到当前目录,如图5


图 5

当在处理图像的过程中,“处理图像”的按钮不可以再次点击;“状态”由“空闲”变为“繁忙...”,处理结果后,“处理图像”按钮才变为可点击状态,“状态”由“繁忙...”变为“空闲”。在保存输出图像的过程中,“保存”按钮不可以点击,保存结束后才变为可点击状态。文件保存在当前目录下,同时文件名为了不与目录下的文件发生冲突,使用当前时间对文件进行命名。

系统内部图像处理的方法均使用此前内容介绍的程序。在这里这些程序就不特意贴出来了。完整程序,请查看附件。

系统界面设计方面:

使用guide命令,创建gui界面,使用组件“拖拽”的方式创建界面。

(1)界面初始化时,需要进行操作,可以在该自动生成的方法中进行设置:

function Demo_OpeningFcn(hObject, eventdata, handles, varargin)

(2)我想对于除拖拽外,在m文件的编程方面重要的是要学会如何通过句柄对组件相应属性进行设置。格式如下:

set(handles.axes1,'visible','off');

axes1 是 axes组件的Tag属性,一开始通过界面进行设置。在文件中我们就可以通过该属性获得对应组件,那么要设置动态属性时,就只要通过类似以上格式进行编写即可。handles.axes1 参数后面跟着需要设置的属性,而第3个参数则是对应的属性值。这样我们就学会了如何在程序中设置组件的属性。

(3)读取输入图像的程序(可进行图像文件的选择):

%读取输入图像
% --- Executes on button press in btn_imread.
function btn_imread_Callback(hObject, eventdata, handles)
% hObject    handle to btn_imread (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global srcIma;
 
[filename, path] = uigetfile({'*.bmp; *.tif; *.jpg','图片类型(*.bmp; *.tif, *.jpg)'},'请选择图片');
if filename~=0
    srcIma = imread([path,filename]);
else
    return;
end
set(handles.axes1,'visible','on');
axes(handles.axes1);
imshow(srcIma);
end

注意:global关键字表示 srcIma变量为全局变量,允许在其他函数中使用该srcIma变量,使用前仍需使用 global srcIma; 进行声明。

结果如图6

图 6

(4)警告框的使用:

warndlg('对比度拉伸区间不能为空','!! 警告提示 !!');

格式:warndlg(内容,标题);

对于不符合程序的输入,进行提示,如图7

图 7

(5)“下拉列表”修改选项时,“下拉列表”下的“功能模块”也发生对应的变化。这个是肿么做到的呢?我一开始是将几个面板都叠加在一起,不同面板负责不同的功能模块,在“下拉列表”该组件增加回调方法,修改选项,对应面板进行显示,而其他面板不进行显示。当然这种猜想是非常正确可行的。但是,在我们手动“拖拽”面板进行叠加的过程中会发现,面板不是真正意义上的叠加,而是面板“放到”了另外一个面板中,这样当对面板进行可见性(visible)设置时就会影响到其他面板,所以我们要另外寻找正确叠加的方式。通过网上资料的搜索,发现,可以对不同面板设置 position 属性,在不同面板在未叠加时,通过position属性,设置不同面板在相同位置,这样就可以达到我们想要的效果。操作如图6

图 6

关于面板切换的程序如下(对下拉列表设置回调方法):

(设置回调方法的方式如图7

对组件右键,选择对应选项,就会自动生成对应的回调程序

图 7

% --- Executes on selection change in popupmenu_func_select.
function popupmenu_func_select_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu_func_select (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
clc
% Hints: contents = get(hObject,'String') returns popupmenu_func_select contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu_func_select
    type=get(handles.popupmenu_func_select,'value');
    if type==1 %选择“图像简单处理”
        set(handles.uipanel_simple, 'visible', 'on');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea,'visible','off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==2 %选择“图像的灰度变换”
        set(handles.uipanel_simple, 'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','on');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea,'visible','off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==3 %选择“图像的直方图均衡化和比特平面分层”
        set(handles.uipanel_simple, 'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','on');
        set(handles.uipanel_kjArea,'visible','off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==4 %选择“空间域滤波”
        set(handles.uipanel_simple,'visible','off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea,'visible','on');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==5 %选择“频率域滤波”
        set(handles.uipanel_simple,'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea, 'visible', 'off');
        set(handles.uipanel_plArea, 'visible', 'on');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==6 %选择“彩色图像的空间域滤波”
        set(handles.uipanel_simple,'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea, 'visible', 'off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','on');
    end
end

(6)“状态”信息的显示:

set(handles.btn_imshow,'enable','off');
    set(handles.text_state,'string','繁忙中...');
    pause(.005);
...
set(handles.btn_imshow,'enable','on');
    set(handles.text_state,'string','空闲');

“处理图像”按钮被点击后,按钮状态发生改变,“状态”信息发生改变。


附件:

function varargout = Demo(varargin)
% DEMO M-file for Demo.fig
%      DEMO, by itself, creates a new DEMO or raises the existing
%      singleton*.
%
%      H = DEMO returns the handle to a new DEMO or the handle to
%      the existing singleton*.
%
%      DEMO('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in DEMO.M with the given input arguments.
%
%      DEMO('Property','Value',...) creates a new DEMO or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before Demo_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to Demo_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 Demo
 
% Last Modified by GUIDE v2.5 26-Nov-2015 18:39:11
 
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Demo_OpeningFcn, ...
                   'gui_OutputFcn',  @Demo_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
end
 
% --- Executes just before Demo is made visible.
function Demo_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 Demo (see VARARGIN)
 
% Choose default command line output for Demo
handles.output = hObject;
 
% Update handles structure
guidata(hObject, handles);
 
% UIWAIT makes Demo wait for user response (see UIRESUME)
% uiwait(handles.figure1);
 
% Matlab运行gui时,出现问题:http://www.ilovematlab.cn/thread-86285-1-1.html
set(handles.axes1,'visible','off');
set(handles.axes2,'visible','off');
set(handles.uipanel_simple,'visible','on');
set(handles.uipanel_huiduchange, 'visible','off');
set(handles.uipanel_histPanel, 'visible','off');
set(handles.uipanel_kjArea, 'visible','off');
set(handles.uipanel_plArea, 'visible','off');
set(handles.uipanel_colorImaKJArea, 'visible','off');
 
end
 
% --- Outputs from this function are returned to the command line.
function varargout = Demo_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;
end
 
%读取输入图像
% --- Executes on button press in btn_imread.
function btn_imread_Callback(hObject, eventdata, handles)
% hObject    handle to btn_imread (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global srcIma;
 
[filename, path] = uigetfile({'*.bmp; *.tif; *.jpg','图片类型(*.bmp; *.tif, *.jpg)'},'请选择图片');
if filename~=0
    srcIma = imread([path,filename]);
else
    return;
end
set(handles.axes1,'visible','on');
axes(handles.axes1);
imshow(srcIma);
end
 
%显示处理后的输出图像
% --- Executes on button press in btn_imshow.
function btn_imshow_Callback(hObject, eventdata, handles)
% hObject    handle to btn_imshow (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
    clc
    
    
    set(handles.btn_imshow,'enable','off');
    set(handles.text_state,'string','繁忙中...');
    pause(.005);
    
    global srcIma;
    global im;
    hasRes=0;
    if strcmp(get(handles.uipanel_simple, 'visible'),'on')
        if get(handles.rb_readshow, 'value')
            im=readShow(); %读取显示图像
            hasRes=1;
        elseif get(handles.rb_cutIma, 'value')
            if get(handles.edit_cut,'string')
                str=get(handles.edit_cut,'string');
                n=str2double(str);
                if n<0
                    n=0;
                elseif n>1
                    n=1;
                end
            else
                n=1;
            end
 
            im=cutIma(n); %截取图像
            hasRes=1;
        end
    end
    if strcmp(get(handles.uipanel_huiduchange, 'visible'),'on')
        if get(handles.rb_rotation, 'value')
            if get(handles.edit_rotateAngle,'string')
                str=get(handles.edit_rotateAngle,'string');
                angle=str2double(str);
            else
                angle=0;
            end
            im=myRotation(angle); %旋转图像
            hasRes=1;
        elseif get(handles.rb_fanse,'value')
            im=myFanse();
            hasRes=1;
        elseif get(handles.rb_contr_conver,'value')
            if size(srcIma,3)==1
                warndlg('请输入彩色图像','!! 警告提示 !!');
            else
                if get(handles.edit_contr_mi,'string')
                    if get(handles.edit_contr_ma,'string')
                        str1=get(handles.edit_contr_mi,'string');
                        str2=get(handles.edit_contr_ma,'string');
 
                        mi=str2double(str1);
                        ma=str2double(str2);
                        im=myContrConver(mi,ma);
                        hasRes=1;
                    else
                        warndlg('对比度拉伸区间不能为空','!! 警告提示 !!');
                    end
                else
                    %msgbox('对比度拉伸区间不能为空','警告提示');
                    warndlg('对比度拉伸区间不能为空','!! 警告提示 !!');
                end
            end
        end
    end
    
    if strcmp(get(handles.uipanel_histPanel, 'visible'),'on')
        if get(handles.rb_hist, 'value')
            [im T]=JunHengHua();
            hasRes=1;
        elseif get(handles.rb_bitPanel, 'value')
            if size(srcIma,3)~=1
                warndlg('请输入灰度色图像','!! 警告提示 !!');
            else
                if get(handles.edit5, 'string')
                    str=get(handles.edit5, 'string');
                    pos=str2double(str);
                    if pos <= 0 || pos >8
                        warndlg('输入的比特层数应满足1~8这个范围','!! 警告提示 !!');
                    else
                        im=get8BitPM2(pos);
                        hasRes=1;
                    end
                else
                    warndlg('请输入比特层数','!! 警告提示 !!');
                end
            end
        end
    end
    
    if strcmp(get(handles.uipanel_kjArea, 'visible'),'on')
        if size(srcIma,3)~=1
                warndlg('请输入灰度色图像','!! 警告提示 !!');
        else
            if get(handles.rb_gsfilter, 'value')
                im=mySpatialFilter('高斯均值滤波器',[3 3]);
                hasRes=1;
            elseif get(handles.rb_centerFilter, 'value')
                im=mySpatialFilter('中值滤波器',[3 3]);
                hasRes=1;
            elseif get(handles.rb_maxFilter, 'value')
                im=mySpatialFilter('最大值滤波器',[3 3]);
                hasRes=1;
            elseif get(handles.rb_minFilter, 'value')
                im=mySpatialFilter('最小值滤波器',[3 3]);
                hasRes=1;
            elseif get(handles.rb_sobel, 'value')
                im=mySobelGradCal();
                hasRes=1;
            end
        end
    end
    if strcmp(get(handles.uipanel_plArea, 'visible'),'on')
        if size(srcIma,3)~=1
                warndlg('请输入灰度色图像','!! 警告提示 !!');
        else
            if get(handles.rb_glpf, 'value')
                if get(handles.edit_D0, 'string')
                    str=get(handles.edit_D0, 'string');
                    D0=str2double(str);
                    im=myGLPF(D0);
                    hasRes=1;
                else
                    warndlg('请输入截止频率','!! 警告提示 !!');
                end
            end
        end
    end
    
    if strcmp(get(handles.uipanel_colorImaKJArea, 'visible'),'on')
        if size(srcIma,3)==1
                warndlg('请输入彩色图像','!! 警告提示 !!');
        else
            if get(handles.rb_rgbTohsi, 'value')
                im=RGBtoHSI();
                hasRes=1;
            elseif get(handles.rb_hsiTorgb, 'value')
                im=HSItoRGB();
                hasRes=1;
            elseif get(handles.rb_mySpatialFilter, 'value')
                im=useHSIGS();
                hasRes=1;
            end
        end
    end
    
    if hasRes==1
        set(handles.axes2,'visible','on');
        axes(handles.axes2);
        imshow(im);
    end
    
    set(handles.btn_imshow,'enable','on');
    set(handles.text_state,'string','空闲');
end
 
% --- Executes on selection change in listbox1.
function listbox1_Callback(hObject, eventdata, handles)
% hObject    handle to listbox1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: contents = get(hObject,'String') returns listbox1 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listbox1
end
 
% --- Executes during object creation, after setting all properties.
function listbox1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to listbox1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: listbox 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
end
 
 
% --- Executes on selection change in popupmenu_func_select.
function popupmenu_func_select_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu_func_select (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
clc
% Hints: contents = get(hObject,'String') returns popupmenu_func_select contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu_func_select
    type=get(handles.popupmenu_func_select,'value');
    if type==1 %选择“图像简单处理”
        set(handles.uipanel_simple, 'visible', 'on');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea,'visible','off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==2 %选择“图像的灰度变换”
        set(handles.uipanel_simple, 'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','on');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea,'visible','off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==3 %选择“图像的直方图均衡化和比特平面分层”
        set(handles.uipanel_simple, 'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','on');
        set(handles.uipanel_kjArea,'visible','off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==4 %选择“空间域滤波”
        set(handles.uipanel_simple,'visible','off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea,'visible','on');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==5 %选择“频率域滤波”
        set(handles.uipanel_simple,'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea, 'visible', 'off');
        set(handles.uipanel_plArea, 'visible', 'on');
        set(handles.uipanel_colorImaKJArea, 'visible','off');
    elseif type==6 %选择“彩色图像的空间域滤波”
        set(handles.uipanel_simple,'visible', 'off');
        set(handles.uipanel_huiduchange, 'visible','off');
        set(handles.uipanel_histPanel, 'visible','off');
        set(handles.uipanel_kjArea, 'visible', 'off');
        set(handles.uipanel_plArea, 'visible', 'off');
        set(handles.uipanel_colorImaKJArea, 'visible','on');
    end
end
 
% --- Executes during object creation, after setting all properties.
function popupmenu_func_select_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu_func_select (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
end
 
%exp1_1
%输入图像和显示图像
function resIma = readShow()
    global srcIma;
    resIma=srcIma;
end
 
%exp1_3
%参数n表示剪切原图像的n
function resIma=cutIma(n)
    global srcIma;
    ima=srcIma;
    ima=double(ima);
    swh=size(ima);
    sh=swh(:,1);
    sw=swh(:,2);
    dh=round(sh*n);
    dw=round(sw*n);
    resIma=ima(1:dh,1:dw);
    resIma=uint8(resIma);
end
 
%exp2_1
%图像的旋转
function resIma=myRotation(angle)
    global srcIma;
    ima=srcIma;
    ima=double(ima);
    [r,c,h]=size(ima);
 
    %将角度单位化为弧度单位
    R=-angle*pi/180;
    %这样的宽高会出现BUG,原因不明
    %h2 = ceil(r*cos(R)+c*sin(R));
    %w2 = ceil(r*sin(R)+c*cos(R));
 
    %将对角线作为旋转后图像的宽高
    h2=ceil(sqrt(r*r+c*c));
    w2=h2;
 
    resIma=zeros(h2,w2,h);
 
    %旋转时x y的偏移量
    dx=-0.5*w2*cos(R)-0.5*h2*sin(R)+0.5*c;
    dy=0.5*w2*sin(R)-0.5*h2*cos(R)+0.5*r;
 
    %采用反向映射
    for i=1:h
        for x=1:h2
            for y=1:w2
                %由结果图像的坐标 得出 原来图像的坐标
                x0=ceil(x*cos(R)+y*sin(R)+dx); 
                y0=ceil(-x*sin(R)+y*cos(R)+dy);
 
                if x0>0 && x0<=r && y0>0 && y0<=c
                    resIma(x,y,i)=ima(x0,y0,i);
                end
            end
        end
    end
    resIma=uint8(resIma);
end
 
%exp2_2
%图像的反色
function resIma=myFanse()
    global srcIma;
    ima=srcIma;
    ima = double(ima);
    [r c m] = size(ima);
    resIma = zeros(r,c,m);
    for i=1:m
        for j=1:r
            for k=1:c
                resIma(j,k,i)=255-ima(j,k,i); %由最高灰度级减去原坐标位置的灰度级进行反色
            end
        end
    end
    resIma = uint8(resIma);
end
 
%exp2_3
%图像的对比度拉伸
function resIma=myContrConver(mi, ma)
    global srcIma;
    ima=srcIma;
    ima = double(ima);
    [r c m] = size(ima);
    resIma = zeros(r,c,m);
    %for i=1:m
    %    for j=1:r
    %        for k=1:c
    %            im2(j,k,i)=min+(im1(j,k,i)-minR)/(maxR-minR)*(max-min);
    %        end
    %    end
    %end
 
    %先对原图像的 灰度级 进行归一化,再由归一化的区间缩放至所需区间
    tempIma1=ima(:,:,1);
    tempIma2=ima(:,:,2);
    tempIma3=ima(:,:,3);
    resIma(:,:,1)=mi+(ima(:,:,1)-min(tempIma1(:)))/(max(tempIma1(:))-min(tempIma1(:)))*(ma-mi);
    resIma(:,:,2)=mi+(ima(:,:,2)-min(tempIma2(:)))/(max(tempIma2(:))-min(tempIma2(:)))*(ma-mi);
    resIma(:,:,3)=mi+(ima(:,:,3)-min(tempIma3(:)))/(max(tempIma3(:))-min(tempIma3(:)))*(ma-mi);
 
    resIma=uint8(resIma);
end
 
%exp3_2
% im2表示均衡化的图像,T表示均衡化的变换函数
function [resIma,T]=JunHengHua()
    global srcIma;
    ima=srcIma;
    [r c]=size(ima);
    ima=double(ima(:)); %将其转化为行向量,易于下面对灰度级的查找
    resIma=zeros(r*c,1); %对应转化后的im1
    L=256;
    im1_H=zeros(1,L); %原图像的直方图
    %im2_H=im1_H;
    H_sum=0; %累计原图像的直方图
    T=im1_H;
    for k=1:L
        tempK=k-1;
        posK=find(ima==tempK); %寻找对应灰度值在原图像中的位置
        im1_H(k)=length(posK)/(r*c); %原图像的直方图,并进行归一化
        H_sum=H_sum+im1_H(k); %以求和代替积分,求累计原图像的直方图
        T(k)=(L-1)*H_sum; %求得原图像均衡化过程的变化函数
        if (T(k)-floor(T(k))) > 0.5 %进行四舍五入操作
            resIma(posK)=ceil(T(k)); %得到变换后的灰度,赋值给原位置
        else
            resIma(posK)=floor(T(k));
        end
    end
    resIma=uint8(reshape(resIma,r,c)); %将im2转为r行c列 无符号8位的矩阵
end
 
%exp3_3
%图像的比特平面分层
function resIma = get8BitPM2(pos)
    global srcIma;
    ima=srcIma;
    [r c] = size(ima);
    im1 = dec2bin(ima(:),8); %将原图像的矩阵转化为列向量,并且将向量的各个元素转化为8位二进制数
 
    tempA=bin2dec(im1(:,pos))*255; %其中 im1(:,pos)表示取 im1中 所有行的元素的第 pos 位,再将其转化为 十进制数。此时该数为0或1,将灰度进行拉伸,变换到0或255
    %即得第 pos 比特平面
    tempA=reshape(tempA,r,c); %将A转化为r行 c列的矩阵
    
    resIma=tempA;
end
 
%exp4_1
%pho 表示输入图像的名称
%filter_type 所选择的滤波器类型。有:高斯均值滤波器、中值滤波器、最大值滤波器、最小值滤波器
%filter_size 定义滤波器大小,如 filter_size=[3 3];
function resIma = mySpatialFilter(filter_type, filter_size)
    global srcIma;
    ima=srcIma;
    ima=double(ima); %转化为双精度类型
    [r c]=size(ima); %读取原图像的行数和列数
 
    if strcmp(filter_type, '高斯均值滤波器')
        filter_size=[3 3];
    end
    m=filter_size(1); %读取设置的滤波器模板的大小
    n=filter_size(2);
 
    rs=r+m-1; %计算边界填充后的图像大小(填充模板大小)
    cs=c+n-1;
    tIma=zeros(rs,cs); %创建一个边界填充后的矩阵
    tIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2)=ima; %矩阵中间填充原图像灰度级
 
    %以最邻近的边界作为边界填充的灰度值
    %先填充上边界
    for i=1:(m-1)/2
        tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(1);
    end
    %填充下边界
    for i=rs-(m-1)/2+1:rs
        tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(r);
    end
    %填充左边界
    for i=1:(n-1)/2
        tIma(:,i)=tIma(:,(n-1)/2+1);
    end
    %填充右边界
    for i=cs-(n-1)/2+1:cs
        tIma(:,i)=tIma(:,cs-(n-1)/2);
    end
 
    rIma=zeros(rs,cs);
    %遍历该矩阵,套用滤波模板
    for i=1:rs-m+1
        for j=1:cs-n+1
            %读取模板覆盖处的图像
            tempIma=tIma(i:i+m-1, j:j+n-1);
            %计算该模板覆盖的中心位置
            centerR=i+(m-1)/2;
            centerC=j+(m-1)/2;
            switch filter_type
                case '高斯均值滤波器'
                    %定义3 x 3的高斯均值滤波器模板
                    module=[1 2 1; 2 4 2; 1 2 1];
                    module=module(:)';
                    %为邻域以该模板为系数进行加权求平均,得出的值赋值得邻域中心
                    rIma(centerR,centerC)=module*tempIma(:)/sum(module);
                case '中值滤波器'
                    %为邻域内的值排序,求得中值,将该值赋值给邻域中心
                    tempIma=sort(tempIma(:));
                    rIma(centerR,centerC)=tempIma((length(tempIma)+1)/2,1);
                case '最大值滤波器'
                    %求邻域中的最大灰度值,将该值赋值给邻域中心
                    rIma(centerR,centerC)=max(tempIma(:));
                case '最小值滤波器'
                    %求邻域中的最小灰度值,将该值赋值给邻域中心
                    rIma(centerR,centerC)=min(tempIma(:));
                otherwise
                    error('不存在该滤波器');
            end
        end
    end
    %去除原先填充的边界,得出最终结果
    resIma=rIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2);
    resIma=uint8(resIma);
end
 
%exp4_2
%mySobelGradCal函数使用Sobel梯度算子作为微分滤波器模板,对输入图像进行锐化操作
%参数 pho 表示输入图像的路径,如 EXP4-3.tif
function grad2=mySobelGradCal()
    global srcIma;
    ima=srcIma;
    ima=double(ima); %转化为双精度类型对图像进行操作
    [r c]=size(ima); %获取输入的图像的行数和列数
    m=3; %Sobel梯度算子的梯度模板大小(行)
    n=3; %Sobel梯度算子的梯度模板大小(列)
    %边界填充后的大小
    rs=r+m-1;
    cs=c+n-1;
    %创建边界填充的矩阵
    tIma=zeros(rs,cs);
    %将输入图像填充在该矩阵的中心
    tIma((m-1)/2+1:rs-(m-1)/2,(n-1)/2+1:cs-(n-1)/2)=ima;
 
    for i=1:(m-1)/2
        %为矩阵填充下边界,根据输入图像的下边界进行填充
        tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(1,:);
        %为矩阵填充上边界,根据输入图像的上边界进行填充
        tIma(rs-i-1,(n-1)/2+1:cs-(n-1)/2)=ima(r,:);
    end
 
    for i=1:(n-1)/2
        %为矩阵填充左边界,根据矩阵已填充的左边一列进行填充
        tIma(:,i)=tIma(:,(n-1)/2+1);
        %为矩阵填充右边界,根据矩阵已填充的右边一列进行填充
        tIma(:,cs-i-1)=tIma(:,cs-(n-1)/2);
    end
 
    grad2=zeros(rs,cs);
    %以可以让Sobel梯度模板覆盖tIma对tIma进行遍历
    for i=1:rs-m+1
        for j=1:cs-n+1
            %取出当前被梯度模板覆盖的区域(灰度值)——邻域
            tempIma=tIma(i:i+m-1,j:j+n-1);
            %求邻域的中心
            centerR=i+(m-1)/2;
            centerC=j+(n-1)/2;
            %使用Sobel梯度算子进行计算
            x=abs(sum([tempIma(3,:) tempIma(3,2)])-sum([tempIma(1,:) tempIma(1,2)]));
            y=abs(sum([tempIma(:,3); tempIma(2,3)])-sum([tempIma(:,1); tempIma(2,1)]));
            grad2(centerR,centerC)=x+y;
        end
    end
    %截取出grad2中中心部分即为输出结果
    grad2=grad2((m-1)/2+1:rs-(m-1)/2,(n-1)/2+1:cs-(n-1)/2);
    grad2=uint8(grad2);
end
 
%exp5_1
%pho参数为输入图像的路径
%D0参数为截止频率
function im2 = myGLPF(D0)
    global srcIma;
    ima=srcIma;
 
    %得到高斯低通滤波器
    [r c] = size(ima); %获取输入图像的行和列
    D = zeros(r,c); %D(u,v)是距频率矩形中心的距离
    for i=1:r
        for j=1:c
            D(i,j)=sqrt((i-r/2)^2+(j-c/2)^2);
        end
    end
    H=exp(-(D.^2)/(2*D0*D0)); %计算滤波器,得到高斯低通滤波器
 
    F=fft2(ima,size(H,1),size(H,2)); %对原图像进行傅里叶变换
    F=fftshift(F); %对傅里叶变换后的F进行中心移位
    F1=ifft2(ifftshift(H.*F)); %对中心移位后的F使用高斯低通滤波器后进行反FFT移动(记得一定要进行一次反FFT移动,否则输入结果图片背景会变暗),并进行反变换
    im2=real(F1); %从结果中获取幅度(或称 频率谱)
    im2=uint8(im2);
end
 
%exp6_1
% pho 表示输入图像路径(包括图像名+后缀)
function hsi = RGBtoHSI()
    global srcIma;
    ima=srcIma;
    rgb=double(ima); %将图像转为双精度类型
    rgb=rgb/255; %归一化
    R=rgb(:,:,1); %提取第1个通道
    G=rgb(:,:,2); %提取第2个通道
    B=rgb(:,:,3); %提取第3个通道
 
    angle=(acos(1/2*((R-G)+(R-B))./sqrt((R-G).^2+(R-B).*(G-B))))*180/pi;
    H=angle; %计算H(色调)通道
    H(B>G)=360-H(B>G); %将 B>G 对应位置上的值赋值为 2*pi - angle
    S=1-3./(R+G+B+eps).*min(min(R,G),B); %计算S(色饱和度)通道
    I=1/3*(R+G+B+eps); %计算I(亮度)通道
 
    hsi=cat(3,H/360,S,I); %合成3个通道,为HSI图像
end
 
%exp6_2
% hsi 表示HSI空间图像
function rgb = HSItoRGB()
    global srcIma;
    hsi=srcIma;
    %ima=imread(pho);
    hsi=double(hsi); %转化为双精度类型
    [r c m]=size(hsi); %计算hsi的行列和维度
    H=hsi(:,:,1); %提取H分量
    S=hsi(:,:,2); %提取S分量
    I=hsi(:,:,3); %提取I分量
    H=H*360; %将色调值变为原来的范围[0°,360°]
    R=zeros(r,c); %R分量
    G=zeros(r,c); %G分量
    B=zeros(r,c); %B分量
 
    inv=0<=H & H<120; %RG扇区(inv是H中值在RG扇区的位置)
    B(inv)=I(inv).*(1-S(inv)); %根据在RG扇区时的计算公式计算B分量
    R(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在RG扇区时的计算公式计算R分量
    G(inv)=3*I(inv)-(R(inv)+B(inv)); %根据在RG扇区时的计算公式计算G分量
 
    inv=120<=H & H<240; %GB扇区(inv是H中值在GB扇区的位置)
    H(inv)=H(inv)-120;
    R(inv)=I(inv).*(1-S(inv)); %根据在GB扇区时的计算公式计算R分量
    G(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在GB扇区时的计算公式计算G分量
    B(inv)=3*I(inv)-(R(inv)+G(inv)); %根据在GB扇区时的计算公式计算B分量
 
    inv=240<=H & H<360; %BR扇区(inv是H中值在BR扇区的位置)
    H(inv)=H(inv)-240;
    G(inv)=I(inv).*(1-S(inv)); %根据在BR扇区时的计算公式计算G分量
    B(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在BR扇区时的计算公式计算B分量
    R(inv)=3*I(inv)-(G(inv)+B(inv)); %根据在BR扇区时的计算公式计算R分量
 
    %将各个分量的灰度级拉伸到256个灰度级上
    R=R*255;
    G=G*255;
    B=B*255;
    rgb=cat(3,R,G,B); %合成彩色图像
    rgb=uint8(rgb); %转为8位无符号整型
end
 
%exp6_3
%filter_type 所选择的滤波器类型。有:3x3高斯均值滤波器、5x5高斯均值滤波器、中值滤波器、最大值滤波器、最小值滤波器
%filter_size 定义滤波器大小,如 filter_size=[3 3];
function ima2 = mySpatialFilter2(ima, filter_type, filter_size)
    %ima=imread(pho); %根据路径读取原图像
    ima=double(ima); %转化为双精度类型
    [r c]=size(ima); %读取原图像的行数和列数
 
    %设置高斯均值滤波器只有3x3或5x5大小的
    if strcmp(filter_type, '3x3高斯均值滤波器')
        filter_size=[3 3];
    end
 
    if strcmp(filter_type, '5x5高斯均值滤波器')
        filter_size=[5 5];
    end
    m=filter_size(1); %读取设置的滤波器模板的大小
    n=filter_size(2);
 
    rs=r+m-1; %计算边界填充后的图像大小(填充模板大小)
    cs=c+n-1;
    tIma=zeros(rs,cs); %创建一个边界填充后的矩阵
    tIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2)=ima; %矩阵中间填充原图像灰度级
 
    %以最邻近的边界作为边界填充的灰度值
    %先填充上边界
    for i=1:(m-1)/2
        tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(1);
    end
    %填充下边界
    for i=rs-(m-1)/2+1:rs
        tIma(i,(n-1)/2+1:cs-(n-1)/2)=ima(r);
    end
    %填充左边界
    for i=1:(n-1)/2
        tIma(:,i)=tIma(:,(n-1)/2+1);
    end
    %填充右边界
    for i=cs-(n-1)/2+1:cs
        tIma(:,i)=tIma(:,cs-(n-1)/2);
    end
 
    rIma=zeros(rs,cs);
    %遍历该矩阵,套用滤波模板
    for i=1:rs-m+1
        for j=1:cs-n+1
            %读取模板覆盖处的图像
            tempIma=tIma(i:i+m-1, j:j+n-1);
            %计算该模板覆盖的中心位置
            centerR=i+(m-1)/2;
            centerC=j+(m-1)/2;
            switch filter_type
                case '3x3高斯均值滤波器'
                    %定义3 x 3的高斯均值滤波器模板
                    module=[1 2 1; 2 4 2; 1 2 1];
                    module=module(:)';
                    %为邻域以该模板为系数进行加权求平均,得出的值赋值得邻域中心
                    rIma(centerR,centerC)=module*tempIma(:)/sum(module);
                case '5x5高斯均值滤波器'
                    %定义5 x 5的高斯均值滤波器模板
                    module=[1 2 3 2 1; 2 5 6 5 2; 3 6 8 6 3; 2 5 6 5 2; 1 2 3 2 1];
                    module=module(:)';
                    %为邻域以该模板为系数进行加权求平均,得出的值赋值得邻域中心
                    rIma(centerR,centerC)=module*tempIma(:)/sum(module);
                case '中值滤波器'
                    %为邻域内的值排序,求得中值,将该值赋值给邻域中心
                    tempIma=sort(tempIma(:));
                    rIma(centerR,centerC)=tempIma((length(tempIma)+1)/2,1);
                case '最大值滤波器'
                    %求邻域中的最大灰度值,将该值赋值给邻域中心
                    rIma(centerR,centerC)=max(tempIma(:));
                case '最小值滤波器'
                    %求邻域中的最小灰度值,将该值赋值给邻域中心
                    rIma(centerR,centerC)=min(tempIma(:));
                otherwise
                    error('不存在该滤波器');
            end
        end
    end
    %去除原先填充的边界,得出最终结果
    ima2=rIma((m-1)/2+1:rs-(m-1)/2, (n-1)/2+1:cs-(n-1)/2);
    ima2=uint8(ima2);
end
 
% hsi 表示HSI空间图像
function rgb = HSItoRGB2(hsi)
    %ima=imread(pho);
    hsi=double(hsi); %转化为双精度类型
    [r c m]=size(hsi); %计算hsi的行列和维度
    H=hsi(:,:,1); %提取H分量
    S=hsi(:,:,2); %提取S分量
    I=hsi(:,:,3); %提取I分量
    H=H*360; %将色调值变为原来的范围[0°,360°]
    R=zeros(r,c); %R分量
    G=zeros(r,c); %G分量
    B=zeros(r,c); %B分量
 
    inv=0<=H & H<120; %RG扇区(inv是H中值在RG扇区的位置)
    B(inv)=I(inv).*(1-S(inv)); %根据在RG扇区时的计算公式计算B分量
    R(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在RG扇区时的计算公式计算R分量
    G(inv)=3*I(inv)-(R(inv)+B(inv)); %根据在RG扇区时的计算公式计算G分量
 
    inv=120<=H & H<240; %GB扇区(inv是H中值在GB扇区的位置)
    H(inv)=H(inv)-120;
    R(inv)=I(inv).*(1-S(inv)); %根据在GB扇区时的计算公式计算R分量
    G(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在GB扇区时的计算公式计算G分量
    B(inv)=3*I(inv)-(R(inv)+G(inv)); %根据在GB扇区时的计算公式计算B分量
 
    inv=240<=H & H<360; %BR扇区(inv是H中值在BR扇区的位置)
    H(inv)=H(inv)-240;
    G(inv)=I(inv).*(1-S(inv)); %根据在BR扇区时的计算公式计算G分量
    B(inv)=I(inv).*(1+S(inv).*cosd(H(inv))./cosd(60-H(inv))); %根据在BR扇区时的计算公式计算B分量
    R(inv)=3*I(inv)-(G(inv)+B(inv)); %根据在BR扇区时的计算公式计算R分量
 
    %将各个分量的灰度级拉伸到256个灰度级上
    R=R*255;
    G=G*255;
    B=B*255;
    rgb=cat(3,R,G,B); %合成彩色图像
    rgb=uint8(rgb); %转为8位无符号整型
end
 
% pho 表示输入图像路径(包括图像名+后缀)
% 该函数输入原图像,将原图像转化为HSI彩色图像,在HSI空间使用5x5高斯均值滤波器,再将结果转为RGB输出
function rgb=useHSIGS()
    global srcIma;
    ima=srcIma;
 
    hsi=RGBtoHSI(); %将输入图像由RGB空间向HSI空间转化
    %在使用5x5高斯均值滤波器前,需要将I分量拉伸到[0 255]灰度区间
    %为什么只对I分量进行操作呢?I分量与图像的彩色信息无关。
    %注意差异性:
    %RGB空间中的平均是不同彩色的平均
    %HIS空间中仅仅是强度的平均,色调H和饱和度S均保持不变
    hsi(:,:,3)=mySpatialFilter2(hsi(:,:,3)*255,'5x5高斯均值滤波器',[5 5]);
    hsi(:,:,3)=hsi(:,:,3)/255; %将I分量再转回[0 1]区间
    rgb=HSItoRGB2(hsi); %由HSI空间再转为RGB空间
end
 
 
function edit_cut_Callback(hObject, eventdata, handles)
% hObject    handle to edit_cut (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit_cut as text
%        str2double(get(hObject,'String')) returns contents of edit_cut as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit_cut_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_cut (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
 
 
function edit_rotateAngle_Callback(hObject, eventdata, handles)
% hObject    handle to edit_rotateAngle (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit_rotateAngle as text
%        str2double(get(hObject,'String')) returns contents of edit_rotateAngle as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit_rotateAngle_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_rotateAngle (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
function edit_contr_mi_Callback(hObject, eventdata, handles)
% hObject    handle to edit_contr_mi (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit_contr_mi as text
%        str2double(get(hObject,'String')) returns contents of edit_contr_mi as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit_contr_mi_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_contr_mi (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
function edit_contr_ma_Callback(hObject, eventdata, handles)
% hObject    handle to edit_contr_ma (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit_contr_ma as text
%        str2double(get(hObject,'String')) returns contents of edit_contr_ma as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit_contr_ma_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_contr_ma (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
function edit5_Callback(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit5 as text
%        str2double(get(hObject,'String')) returns contents of edit5 as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
 
function edit_filterSize1_Callback(hObject, eventdata, handles)
% hObject    handle to edit_filterSize1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit_filterSize1 as text
%        str2double(get(hObject,'String')) returns contents of edit_filterSize1 as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit_filterSize1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_filterSize1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
 
function edit_D0_Callback(hObject, eventdata, handles)
% hObject    handle to edit_D0 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Hints: get(hObject,'String') returns contents of edit_D0 as text
%        str2double(get(hObject,'String')) returns contents of edit_D0 as a double
end
 
% --- Executes during object creation, after setting all properties.
function edit_D0_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_D0 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called
 
% Hint: edit 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
end
 
 
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
    global im;
    set(handles.pushbutton3,'enable','off');
    pause(.05);
    
    str=datestr(now,'mmmmdd_yyyyHH_MM_SS_FFFAM');
    imwrite(im,num2str([str,'.tif']));
    set(handles.pushbutton3,'enable','on');
end

2019-12-29 14:53:04 bluecyan 阅读数 32
  • Python可视化界面编程课程 PyQt5实战网课 GUI在线视频...

    课程概述 本课程主要针对PyQT5中的界面部分(GUI)进行学习,分为三部分,包括初级GUI编程、进阶GUI编程和GUI编程实战。 初级GUI编程:从介绍编程环境搭建开始,然后分析最基础的单个窗口框架,接着介绍QT Designer,最后结合实例详细分析基本控件的使用。 进阶GUI编程:主要包括高级界面控件分析、布局管理介绍、信息与槽分析、图形与特效和扩展应用。 GUI编程实战:经典程序开发和微信好友数据分析。 本课程共55节课时,除前两节介绍和安装的课时外,其它每节课都有编程实例,购买本视频教程后,赠送的资料包括课程配套PPT和源码等,入群有老师提供在线解答学习中遇到的问题。 客服QQ群:671935288 请联系客服微信号:18958869699,加入微信群

    56318 人正在学习 去看看 林男

考核内容

一、设计部分(70分)
第一部分:编写一个基于GUI的图像处理程序/软件,功能按钮和界面布局自己设定,遵循美观大方、方便操作的原则;(30分)
第二部分:项目设计内容:(40分)
1、绘制灰度直方图,实现直方图均衡化;(10分)
2、灰度图像的对比度增强;(5分)
3、图形的几何变换;(5分)
4、图像加噪(用输入参数控制不同噪声),然后使用空域和频域进行滤波处理(10分)
5、采用roberts,prewitt,sobel,拉普拉斯算子对图像进行边缘提取;(10分)
二、课程报告(30分)
程序设计完毕后撰写课程报告,即项目设计说明书。要求对界面功能,上面要求的各个算法的原理、流程、功能、运行结果及其对比分析等进行介绍。

总结

数字图像处理这门课笔者这里一周只有一节课,课时是完全不够的,想要深入学习就只有自己努力。不过,笔者志不在此,所以也就上课的时候学了会。这门课期末的考核是一个大作业,所幸大部分内容都能在书上抄到 []( ̄▽ ̄)*。不过有一小部分书上没有的,到网上去搜才发现,相关的内容相比数据结构、算法等真的是少。为了造福大众,笔者给大家分享一份。

一:MATLAB GUI编程总结

二:作业完成参考(包括代码和文档)

2014-11-05 21:36:05 qq_18407337 阅读数 2500
  • Python可视化界面编程课程 PyQt5实战网课 GUI在线视频...

    课程概述 本课程主要针对PyQT5中的界面部分(GUI)进行学习,分为三部分,包括初级GUI编程、进阶GUI编程和GUI编程实战。 初级GUI编程:从介绍编程环境搭建开始,然后分析最基础的单个窗口框架,接着介绍QT Designer,最后结合实例详细分析基本控件的使用。 进阶GUI编程:主要包括高级界面控件分析、布局管理介绍、信息与槽分析、图形与特效和扩展应用。 GUI编程实战:经典程序开发和微信好友数据分析。 本课程共55节课时,除前两节介绍和安装的课时外,其它每节课都有编程实例,购买本视频教程后,赠送的资料包括课程配套PPT和源码等,入群有老师提供在线解答学习中遇到的问题。 客服QQ群:671935288 请联系客服微信号:18958869699,加入微信群

    56318 人正在学习 去看看 林男

  研究生阶段写的一个小文章,内容肤浅,不过转载请注明,谢谢!!

摘要:本文主要介绍了基于MATLAB的图形用户界面(GUI)来制作图像处理软件平台的具体过程和相关技巧,文章主要从几个方面展开论述:第一,简单介绍下GUI与GUIDE;第二,介绍以下GUIDE的模板及其操作方法;第三,详细阐述一下图像处理软件平台的制作方法。本文的GUI例子所制作的图像处理软件可以实现的功能有:五种常用的边缘检测、灰度直方图的显示、灰度直方图的均衡化、对比度自适应直方图的均衡化、图片的二值化以及彩色图片的灰度化。文章基本介绍了以上的内容,关于软件还有许多未能实现的功能有待于日后的逐步开发,从这个简单的实例可以让读者从感性的方面充分了解MATLAB的图形用户界面的相关功能,同时为打算深入学习这一套MATLAB工具集的读者做一个铺垫。

关键词:图形用户界面;图像处理;边缘检测;MATLAB工具集

一、引言

图形用于界面(Graphical User Interfaces,GUI)是提供人机交互的工具和方法。GUI是包含图形对象(如窗口、图标、菜单和文本)的用户界面。以某种方式选择或激活这些对象时,通常会引起动作或者发生变化。一个设计优秀的GUI能够非常直观的让用户知道如何操作MATLAB界面,并且了解设计者的开发意图。MATLAB的GUI为开发者提供了一个不脱离MATLAB的开发环境,有助于MATLAB程序的GUI集成。这样可以使开发者不必理会一大堆烦杂的代码,简化程序,但是同样可以实现向决策者提供图文并茂的界面,甚至达到多媒体的效果。可以说MATLAB提供了一个简便的开发环境,可以让开发者快速上手,提高了开发者的工作效率。

所谓的GUIDE就是图形用户界面开发环境(Graphical User Interface Development Environment),它向用户提供了一系列的创建用户图形界面的工具。这些工具大大简化了GUI设计和生成的过程。GUIDE可以完成的任务有如下两点:1)输出GUI。2)GUI编程。GUIDE实际上是一套MATLAB工具集,它主要由七部分组成:版面设计器、属性编辑器、菜单编辑器、调整工具、对象浏览器、Tab顺序编辑器、M文件编辑器。

二、GUIDE的操作界面及使用方法的介绍

1.启动GUIDE  在命令窗口中直接键入guide,启动GUIDE,或者直接点击MATLAB上   按钮,会出现如图1所示的GUIDE Quick Start对话框。利用GUIDE模板创建GUI,或者打开已经存在的GUI,单击OK按钮,打开版面设计工具,如图2所示。在通常状况下组件面板并不显示出组件的名称,如果需要显示组件名称,则进行下面的操作:从File菜单中选择Preferences选项,勾选Show names in component palette选项即可。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                    图1  GUIDE启动对话框

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                    图 版面设计器

2.GUI文件的介绍  GUIDE把GUI设计的内容保存在两个文件中,它们在第一次保存或运行时生成。一个是FIG文件,扩展名为.Fig,它包含对GUI和GUI组件的完整描述;另外一个是M文件,扩展名为.M,它包含控制GUI的代码和组件的回调事件代码。这两个文件与GUI显示和编程任务相对应。在版面设计器中创建GUI时,内容保存在FIG文件中;对GUI编程时,内容保存在M文件中。通常情况下在版面设计器工具栏上单击   图标可以打开M文件编辑器。图3所示的编辑器显示了GUI with Axes and Menu模板的M文件的内容。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                       图3  M文件编辑器

3.GUIDE环境的设置  用户可以自定义GUIDE设计环境。在File菜单下选择Preferences,打开如图4所示的设置对话框,可以进行相应的设置。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                     图4  GUIDE环境设置

三、基于GUI的图像处理软件平台的设计过程

1.GUIDE版面设计器(即FIG文件)的设计  根据设计需要:首先拖拽两个图形窗口(Axes),一个作为待处理图片区域,另一个作为已处理图片区域;其次,拖拽六个电子按钮(Radio Button),作为边缘检测操作按钮以及一个Panel按钮作为检测按钮的支撑面板;第三,拖拽三个按钮(Push Button),作为灰度变化区域的按钮;最后,拖拽五个按钮(Push Button),作为选取/保存图片及退出等操作按钮。将上面的所有按钮及图形窗口合理的布局,达到美观工整的效果,本文设计的GUIDE如图5所示,然后运行一下GUI,系统会自动生成GUI文件。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                    图5  图像处理软件的GUIDE版面

2.选取图片按钮的GUI设计  要想设计一个图像处理的软件,首先要考虑选取图片,选取什么格式的图片,这个是至关重要的,所以先介绍一下选取图片按钮的GUI设计方法。上面已经规划好了按钮的位置,如果想在点击选取图片按钮时,软件给予响应,需要给按钮输入一定的程序代码,设置代码的方法如下:右键单击选取图片按钮,选择View Callbacks/ Callback,系统会自动带设计者进入此按钮的代码输入区域,在下面的空白处输入如下代码[1]

global im   %定义一个全局变量im

[filename,pathname]=...

    uigetfile({'*.*';'*.bmp';'*.tif';'*.png'},'select picture');  %选择图片路径

str=[pathname filename];  %合成路径+文件名

im=imread(str);   %读取图片

axes(handles.axes1);  %使用第一个axes

imshow(im);  %显示图片

写完上述代码后,保存M文件,然后运行GUI,现在就可以实现选择图片的功能了。当然有选取就要考虑存储已处理好的图片,这就引出了存储图片按钮的GUI设计。

3.存储图片按钮的GUI设计  同样右键单击存储图片按钮,选择View Callbacks/ Callback,进去M文件后在下面的空白处输入如下代码[2]

global BW  %定义处理后的图片BW这个全局变量

[filename,pathname,filterindex]=...

    uiputfile({'*.bmp';'*.tif';'*.png'},'save picture');存储图片路径

if filterindex==0

return  %如果取消操作,返回

else

str=[pathname filename];  %合成路径+文件名

axes(handles.axes2);  %使用第二个axes

imwrite(BW,str);  %写入图片信息,即保存图片

end

4.边缘检测按钮组的GUI设计  本文设计的GUI主要包含了五种最常用的检测算法(即roberts、sobel、prewitt、log、canny检测),右键单击Panel面板,选择View Callbacks/ SelectionChangeFcn,进入M文件后在空白处输入如下代码[3]

global im

global BW  %定义全局变量

str=get(hObject,'string');  %拿到所选按钮的名称

axes(handles.axes2);   %使用第二个axes

 switch str   %选择语句

    case'Initial'  %点击原图按钮

        imshow(im);  %显示原图

    case'Roberts'  %点击Roberts边缘检测按钮

        BW=edge(im,'roberts');

        imshow(BW);

    case'Sobel'  %点击Sobel边缘检测按钮

        BW=edge(im,'sobel');

        imshow(BW);

    case'Prewitt'  %点击Prewitt边缘检测按钮

        BW=edge(im,'prewitt');

        imshow(BW);

    case'Log'  %点击Log边缘检测按钮      

        BW=edge(im,'log');

        imshow(BW);

    case'Canny'  %点击Canny边缘检测按钮

        BW=edge(im,'canny');

        imshow(BW);

end;

5.退出按钮的GUI设计  同样右键单击退出按钮,选择View Callbacks/ Callback,进入M文件中,在空白处输入如下代码:

close(gcf)  %关闭当前Figure窗口句柄

其他按钮代码的设置都与上面叙述的大同小异,相关图像处理程序代码请参考MATLAB7.0图形图像处理[4],在这里将不再累述。

四、图像处理软件的运行举例

    运行GUI,将生成图像处理的软件平台,它可以实现的功能有:五种常用的边缘检测、灰度直方图的显示、灰度直方图的均衡化、对比度自适应直方图的均衡化、图片的二值化以及彩色图片的灰度化。现在运行软件并举些相关图像处理实例。

1.灰度图片边缘检测的举例  首先选择一幅名字为lena256的灰度图片,依次选择五种检测按钮,比较各种边缘检测的处理效果,通过对比,发现Canny

算子对图片的边缘检测效果比较好,其检测效果如图6所示,其它4种算子检测后的效果如图7所示。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                图6  Canny算子对图片的边缘检测效果

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                       图7  其它4种边缘检测效果对比图

2.灰度图片的直方图显示举例  选取名字为cameraman的灰度图片,点击直方图的显示按钮,此灰度图片的直方图分布将显示在第二个axes中,其处理结果如图8所示。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

                         图8  灰度图片直方图显示

3.彩色图片的二值化和灰度化处理举例  选取名字为Water lilies的彩色图片,分别点击二值化和灰度化按钮并保存处理后的图片,其处理后的图片效果如图9所示。

基于MATLAB <wbr> <wbr>GUI的图像处理软件平台的开发

 

五、结束语

    由于MATLAB强大的工程计算和仿真能力,使越来越多的用户从原来的开发环境转到MATLAB上来。现在绝大多数MATLAB开发者都是一些从事一定领域的研究者,他们使用其他的开发环境设计GUI不紧编程复杂、而且学习困难,往往需要花费大量时间在编程上。但是,MATLAB提供了一个简便的开发环境,可以让开发着快速上手,提高了开发者的工作效率。本文详细向读者介绍了MATLAB的GUI的制作方法,通过这个例子,可以清楚的了解GUIDE的设计方法及相关图像处理代码的编辑,使读者从感性的角度认识GUIDE的功能及使用方法,可以说为初学者提供了一个学习平台,打下坚实的基础。

参考文献

1.http://www.ilovematlab.cn/thread-38-1-1.html

2.http://www.ilovematlab.cn/thread-10274-1-1.html

3.http://www.ilovematlab.cn/thread-39-1-1.html

4.王家文.MATLAB7.0图形图像处理.北京:国防工业出版社,2006:103-112.

5.罗军辉.MATLAB7.0在图像处理中的应用.北京:机械工业出版社,2005:121-133.

内容虽然很简单,仅供大家参考,如有不对之处,请给与点评!!!!!!!!!!!

MATLAB中GUI图像处理

阅读数 11801

matlabgui图像处理

博文 来自: u012374012
没有更多推荐了,返回首页