У меня есть функция, показанная ниже glcmcontrast
, которая применяется к изображению в операции скользящего окна с использованием nlfilter.
function s = glcmcontrast(subI)
glcm = graycomatrix(subI,'Offset',[0 1],'NumLevels',64,'Symmetric',true);
stats = graycoprops(glcm,'contrast');
s=stats.Contrast;
Это возвращает скалярное значение для каждого вложенного изображения (окно, переданное nlfilter). Чтобы использовать это с nlfilter, у меня есть дескриптор анонимной функции, и его использование показано ниже.
glcmanon = @(x)glcmcontrast(x);
tic; B = nlfilter(image,[3 3],glcmanon); toc;
Этот код быстро становится очень медленным для изображений с разрешением более 1024 x 1024. В документации отмечается, что colfilt можно использовать с аргументом 'sliding'
для выполнения тех же операций. Мой вопрос в том, как бы я использовал функцию glcmcontrast
с colfilt
. Запуск возвращает ошибку:
tic; B = colfilt(A,[3 3],'sliding',glcmcontrast); toc;
'Error using reshape
To RESHAPE the number of elements must not change.
Error in colfilt (line 183)
b(i*mb+brows,j*nb+bcols) = ...'
Из документации я знаю, что colfilt
изменяет форму массива, используя im2col в (m*n)-by-((i-m+1)*(j-n+1))
, где размер окна [m n]
, а размер изображения [i j]
. Вопрос в том, как мне переписать мою функцию glcmcontrast
в формат, который работает с colfilt
? Строка из colfilt
, которая фактически применяет функцию к измененному массиву,
b = reshape(feval(fun,x,params{:}), size(a));
но я совершенно не понимаю, как применить к этому мою функцию. Я думаю, что проблема связана с тем, что моя функция выводит скалярное значение, но я не уверен.