2016-07-07 61 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()可以按照我所嘗試的名稱對它們進行排序。

因此,而不是有一個良好的日常表現出反常的行爲我有一個破碎的例程,偶然純粹的工作。它甚至輸出的圖像看起來像我期望的輸入混洗!