图像质量评估系统的Matlab GUIDE实现(二)——处理

在导入完图像后,接下来是选择参与的算法,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值