2016-07-07 64 views
3

我使用inputParser来验证输入到在Matlab 2016a的自适应阈值化例程。异常行为

输入是:

AdaptBinarize2(Image, 'WeightedNiblack', 'meanWeight', 0.3, 'varianceWeight', 0.5, 'meanWindow', 8, 'varianceWindow', 8); 

凡名称 - 值对 'meanWindow',8 'varianceWindow',8感兴趣。

的inputParser是在同一个文件作为AdaptBinarize本地功能:

function p = parseInputs(I, algorithm, varargin) 

p = inputParser; 

deft = 0.5; %default t, mean weight 
defs = 2*floor((size(I,1)+size(I,2))/32)+1; %default s, window size 
defk = 0; %default k, variance weight 
defm = 128; %default m, Sauvola variance term (max variance of uint8) 
defPol = 'Bright'; %foreground polarity, 'Bright' or 'Dark' 
defGPU = 'False'; %whether to use CUDA 

addRequired(p, 'I', @isnumeric); 
addRequired(p, 'algorithm', @ischar); 

addOptional(p, 'windowSize', defs, @isint); 
addOptional(p, 'meanWindow', defs, @isint); %<--- this sucks 
addOptional(p, 'varianceWindow', defs, @isint); 

addOptional(p, 'meanWeight', deft, @isnumeric); 
addOptional(p, 'varianceWeight', defk, @isnumeric); 
addOptional(p, 'magicNumber', defm, @isint); 

addOptional(p, 'polarity', defPol, @ischar); 
addOptional(p, 'UseGPU', defGPU, @ischar); 

parse(p,I,algorithm, varargin{:}) 

end 

我使用@isint作为验证功能。 isint在相同的文件中AdaptBinarize2()定义为本地函数:

function bool = isint(x) 

epsilon = 10^-9; 

if mod(x, 1) < epsilon; 
    bool = true; 
else 
    bool = false; 
end 

end 

当进入输入,我得到的错误消息:

Error using AdaptBinarize2>parseInputs (line 371) 
The value of 'meanWindow' is invalid. It must satisfy the function: isint. 

Error in AdaptBinarize2 (line 67) 
p = parseInputs(I, algorithm, varargin{:}); 
%check all the name-value pairs and datatypes. local function. 

isint(8)=真。如果我将meanWindow检查句柄更改为@isnumeric,则解析是成功的。所有其他使用@isint通过的健全性检查。包含同时输入相同值且仍然通过的变量窗口。

当改变@isint到@isnumeric值之后提取所述inputParser结构中的值与相同的数据类型相同。

如果我切换meanWindow和varianceWindow的线inputParser完全相同的行为发生在反向,与varianceWindow失败除非我改变测试和meanWindow传递。输入的顺序似乎没有任何影响。

发生了什么,为什么?

+0

您的输入是什么? – excaza

回答

0

我认为你需要使用addParameter而非addOptional

addOptional指示参数是可选的参数。可选参数从第一个参数开始,必须按顺序排列,但后面的参数可以省略并替换为默认值。

addParameter指示参数是参数值对。参数 - 值对参数可以以任何顺序出现,并且与参数的名称及其值一起作为一对传入。

PS在R2013b之前,使用addParamValue而不是addParameter

0

没关系,橡胶躲开它。语法错了,虽然addOptional()会像addParameter()一样工作。 addOptional()是一个位置参数,所以名称字符串标识符不足以将东西推入正确的位置。 addParameter()可以按照我所尝试的名称对它们进行排序。

因此,而不是有一个良好的日常表现出反常的行为我有一个破碎的例程,偶然纯粹的工作。它甚至输出的图像看起来像我期望的输入混洗!