这是我毕业设计的题目,闲来没事在此整理一下。
本系统使用matlab的guide实现,最终其布局如下:
图中各控件与代码中的标记名(Tag)以及主要功能:
控件名 | Tag | 描述 |
全参考评估 | radiobutton1 | 选择评估方法 |
无参考评估 | radiobutton2 | 选择评估方法 |
导入源图像 | pushbutton1 | 导入图像 |
导入参考图像 | pushbutton2 | 导入图像 |
评估 | pushbutton3 | 执行评估 |
查看运行日志 | pushbutton4 | 显示/关闭静态文本 |
计算综合权值 | pushbutton5 | 弹窗显示多算法的综合权值 |
坐标轴左 | axex1 | 显示源图像 |
坐标轴右大 | axex2 | 显示参考图像 |
坐标轴右小 | axex3 | 模拟进度条显示运行进度 |
表格 | uitable | 显示评估结果 |
多选组 | checkbox1-7 | 选择参与评估的算法 |
静态文本 | text2 | 显示运行日志 |
该系统功能如下:
运行流程如下:
初始页面:
点击“全参考评估”或无参考评估:
分别导入图像后,在右上角选择算法,点击评估按钮:
最后打开工作日志和显示综合权值:(每个算法的权值可在表格右侧修改)
一、选择方法(全参考/无参考)
这是操作的第一步,在系统运行的各个阶段点击rabiobutton时,都要产生如之前产生所示的效果(全参考显示两个示例图和两个导入图像按钮,无参考只显示左边),需要更改其他的显示状态,使得在任意环境下点击按钮显示的都为同一效果。
在GUIDE中,使用set(handles.控件tag,属性名,属性)来更改某个控件的属性值或使用get(handles.控件tag,属性名)来获得某个属性值,如果想要判断get返回的字符串是否为想要的字符串,需要使用strcmp(),而不能直接使用==。
1.点击radiobutton1(全参考算法):
radiobutton2设置为不点击(value为0),进度条回到初始等待状态(通过mywaitbar自定义函数),显示(visiable=='on')评估、导入图像按钮(pushbutton1-3),显示实例图像,显示可选算法的多选框(checkbox1-7),并显示将显示的名字(String)改为算法名:
function radiobutton1_Callback(hObject, eventdata, handles)
set(handles.pushbutton5,'Visible','off');
mywaitbar(0,handles,'Waitting...');
set(handles.radiobutton1,'value',1);
set(handles.radiobutton2,'value',0);
%显示参考图像 以及可选方法
set(handles.axes2,'Visible','on')
set(handles.uitable,'Visible','off')
set(handles.text2,'Visible','off')
set(handles.pushbutton1,'Visible','on')
set(handles.pushbutton2,'Visible','on')
set(handles.pushbutton3,'Visible','on')
set(handles.uipanel1,'Visible','on')
set(handles.checkbox1,'Visible','on')
set(handles.checkbox2,'Visible','on')
set(handles.checkbox3,'Visible','on')
set(handles.checkbox4,'Visible','on')
set(handles.checkbox5,'Visible','on')
set(handles.checkbox6,'Visible','on')
set(handles.checkbox7,'Visible','on')
set(handles.checkbox8,'Visible','on')
set(handles.checkbox1,'String','MSE+PSNR')
set(handles.checkbox2,'String','JND')
set(handles.checkbox3,'String','PDM')
set(handles.checkbox4,'String','SSIM')
set(handles.checkbox5,'String','SIE')
set(handles.checkbox6,'String','QILV+PCQI')
set(handles.checkbox7,'String','VIF')
set(handles.checkbox8,'String','FD')
%显示示例图片
I_example = imread('example.png');
axes(handles.axes1);
imshow(I_example);
axes(handles.axes2);
imshow(I_example);
在GUIDE的function可以不加end和缩进。
2.同理radiobutton2(无参考算法)类似,无参考中使用的算法较少,只使用checkbox的部分并修改String:
function radiobutton2_Callback(hObject, eventdata, handles)
set(handles.pushbutton5,'Visible','off');
mywaitbar(0,handles,'Waitting...');
set(handles.radiobutton1,'value',0);
set(handles.radiobutton2,'value',1);
set(handles.axes2,'Visible','off') %无参考只需要一张图 第二个及按钮隐藏
axes(handles.axes2);
cla;
set(handles.pushbutton1,'Visible','on')
set(handles.pushbutton2,'Visible','off')
set(handles.pushbutton3,'Visible','on')
set(handles.uipanel1,'Visible','on')
set(handles.checkbox1,'Visible','on')
set(handles.checkbox2,'Visible','on')
set(handles.checkbox3,'Visible','off')%调整大小 第三个关闭
set(handles.checkbox4,'Visible','on')
set(handles.checkbox5,'Visible','on')
set(handles.checkbox6,'Visible','off')
set(handles.checkbox7,'Visible','off')
set(handles.checkbox8,'Visible','off')
set(handles.checkbox1,'String','BRISQUE')
set(handles.checkbox2,'String','CNotR_NSS')
set(handles.checkbox3,'String','NOT DISPLAY')
set(handles.checkbox4,'String','UCIQE')
set(handles.checkbox5,'String','UIQM')
set(handles.checkbox6,'String','NOT DISPLAY')
set(handles.checkbox7,'String','NOT DISPLAY')
set(handles.checkbox8,'String','NOT DISPLAY')
set(handles.uitable,'Visible','off')
set(handles.text2,'Visible','off')
%示例图片
I_example = imread('example.png');
axes(handles.axes1);
imshow(I_example);
只令axes的visiable为off是不行的,必须使用axex(.....);cla ;才可以关闭该axes,否则还会留在界面上。
二、导入图像(pushbutton1-2)
1.导入源图像(待评估图像)(pushbutton1):
点击时会从弹出本地文件选择窗口(系统函数uigetfile),选择完成后从选择的路径读取图像,由于读取是在函数内进行,变量作用域为函数内,所以在imread前应声明该变量(I1)为全局变量(global I1)。
根据发生的条件,关闭结果显示、日志显示(uitable 和text2 slider)[点击导入图像前上次评估完成],如果选择的是全参考算法,那么还要显示第二个预览图和第二个输入图像按钮,否则无法导入参考图像。
function pushbutton1_Callback(hObject, eventdata, handles)
[filename,pathname]=uigetfile({'*.png';'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像');
if isequal(filename,0)||isequal(pathname,0)
errordlg('No Files Selected!','ERROR');
return;
else
file=[pathname,filename];
end
global I1;%设置全局变量
I1 = imread(file);
axes(handles.axes1);
imshow(I1);
set(handles.uitable,'Visible','off');
set(handles.text2,'Visible','off');
set(handles.slider1,'Visible','off');
set(handles.pushbutton4,'String','打开运行日志');
if get(handles.radiobutton1,'Value')
set(handles.pushbutton2,'Visible','on');
end
mywaitbar(0,handles,'Waitting...');
2.导入参考图像按钮类似。
function pushbutton2_Callback(hObject, eventdata, handles)
[filename,pathname]=uigetfile({'*.png';'*.jpg';'*.bmp';'*.tif';'*.*'},'载入图像');
if isequal(filename,0)||isequal(pathname,0)
errordlg('No Files Selected!','ERROR');
return;
else
file=[pathname,filename];
end
global I2;
I2 = imread(file);
axes(handles.axes2);
imshow(I2);
set(handles.uitable,'Visible','off');
set(handles.slider1,'Visible','off');
set(handles.text2,'Visible','off');
set(handles.pushbutton4,'String','打开运行日志');
mywaitbar(0,handles,'Waitting...');
未完待续。。。