У меня есть функция показа ниже 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));
, но я совершенно растерялся относительно того, как применить мою функцию к этому.Я думаю, что проблема связана с тем, что моя функция выводит скалярное значение, но я не уверен ..