在导入完图像后,接下来是选择参与的算法,GUIDE默认点击让该多选框的value改变,不用自己挨个写在callback函数里。
三、评估按钮(pushbutton3):
点击后会将右侧的图像和导入参考图像按钮隐藏掉(腾出空间显示结果和日志)。使用warning('off')关闭警告,使用tic,toc计时。使用diary('xxxx.txt')用来写入运行时在命令行窗口显示的中间结果、提示等,diary on开始写入 diary off停止。首先,对于全局图像I1(和I2),可能存在图像过大或过小的问题,首先将图像缩放到合适的大小,如果是全参考方法可能存在两个图不一样大的问题,首先在pushbutton3的callback中调用自定义函数prepossess进行图像的如预处理:
function prepossess(hObject, eventdata, handles)
if exist('rs.mat')
else
scale=1;
save('rs.mat','scale');
end
load('rs.mat')
global I1;
global I1_s;
global I2;
global I2_s;
scale_s=power(2,scale-1);
I1_s=imresize(I1,1/(scale_s));
if get(handles.radiobutton1,'Value')
I2_s=imresize(I2,1/(scale_s));
end
%将I2调整到I1 相同大小
% 大于1000或小于100则调整
[m1 n1 d1]=size(I1_s);
if m1<100
I1_s=imresize(I1_s,[500,500/m1*n1],'bicubic');
elseif m1>1000
I1_s=imresize(I1_s,[500,500/m1*n1],'bicubic');
end
if get(handles.radiobutton1,'Value')
[m2 n2 d2]=size(I2_s);
if sum(abs(size(I1_s)-size(I2_s)))~=0
if size(I1_s,1)<m2 %
I2_s=imresize(I2_s,[size(I1_s,1),size(I1_s,2)]);
else
I1_s=imresize(I1_s,[m2,n2]);
end
end
end
I1_s和I2_s为I1、2处理后的图像,后续评估的都是处理后的图像,该函数前半截先读取rs.mat(如果没有那就把1写入)数据先缩放(下采样)[在之后介绍],之后根据大小,如果高小于100或大于1000,那么等比例双三次插值(bicubic)缩放到高为500,如果两个图不一样大(sum(abs(size-size))~=0),那么高度稍大的图像会调整到另一图像等大。
2.调用完prepossess后,buttonpush3_callback函数使用全局图像I1_s,I2_s,
(1)如果是全参考(RF),添加路径(addpath,用于读取算法)检查checkbox的值,用来创建存放结果的元组stringcell【使用元组原因:每个元素的类型可以不同,每行的列数可以不同】。遍历时控件名的获取:
eval(strcat('handles.checkbox',num2str(i)))
如果该checkbox的value为1,则计数+1,(代码中出现i为多少,再次加1,是因为有的checkbox对应多个算法,即如果该checkbox打勾,就输出多个算法的结果)。
置stringcell的下标index为0,再次遍历每个checkbox是否打勾,由于每个checkbox对应的算法和处理结果不尽相同,所以是挨个写的。如果该checkbox打勾:index自增1,然后进度条更新:
mywaitbar(index/num,handles,['Start to Calculate MSE and PSNR ',num2str(floor(index*100/num)),'%']);
num为算法总数,[]内为显示的文字和百分数。
之后调用对应的算法(放于某目录下),获得返回值,写入stringcell的第index行,一共四列,分别为算法名,分数,最高分数(手动赋值),归一化后分数(线性映射到【0,1】区间,0最低,1最高)。
遍历结束后,执行mywaitbar(1,handles,'Calculate success.');显示计算完成。
(2)无参考同理(NF)
执行完后,toc计时结束,diary off写入结束。调用自定义函数possess处理
(3)possess:
大致目的:读取rs.mat【之后提到】,获得三个值radp(决定保留几位),ef(有效数字),fn(是否强制归一化),如果不存在mat则写入。对里边的数进行有效数字(vpa)和小数点后保留位数(round)的处理,并根据fn的值对一些不可归一化(最大值不存在或趋向于某个值)的归一化分数那列置为“---”,并在stringcell的第五列(新的一列)写入可修改的数值(其他列不可修改),数值为1/行数,也就是权值,默认为平均,用户可在界面修改。如果修改的数值不为数字,则会弹出提示并清空。最后显示在uitable。(令uitable的data为string_s),string_s为stringcell处理后的元组。
function possess(hObject, eventdata, handles,stringcell)
if exist('var.mat')%存在 则读入
else
radp=4;%小数点后保留几位数字
ef=8;%总有效数字
fn=1;%强制归一化
save('var.mat','radp','ef','fn');
end
load('var.mat')
[m,n]=size(stringcell);
string_s=cell(m,n+1);
for i=1:m
string_s{i,5}=1/m;
string_s{i,1}=stringcell{i,1};%名
if fn==0 &&(strcmp(string_s{i,1},'CNR_NSS') || strcmp(string_s{i,1},'UIQM') || str