Работа со скользящим окном с помощью colfilt

У меня есть функция, показанная ниже 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));

но я совершенно не понимаю, как применить к этому мою функцию. Я думаю, что проблема связана с тем, что моя функция выводит скалярное значение, но я не уверен.


person MBL    schedule 09.03.2012    source источник
comment
Это может быть не по теме, но вы проверили векторизованная версия GLCM?   -  person zenpoy    schedule 12.03.2012
comment
Да. Фактический расчет GLCM с использованием функции Matlab graycomatrix это точка, в которой мой код замедляется. Код, на который вы ссылаетесь, предназначен для расчета функций из GLCM после того, как GLCM был рассчитан с использованием матрицы серого.   -  person MBL    schedule 13.03.2012


Ответы (1)


Согласно документации colfilt:

'sliding' Преобразует каждую скользящую окрестность A размером m на n в столбец во временной матрице, а затем применяет функцию fun к этой матрице. fun должен возвращать вектор-строку, содержащую одно значение для каждого столбца во временной матрице. (Функции сжатия столбцов, такие как sum, возвращают соответствующий тип вывода.) Затем colfilt преобразует вектор, возвращенный fun, в матрицу того же размера, что и A.

Таким образом, вы должны изменить glcmcontrast, чтобы получить m-by-n матрицу «A» и вернуть 1-by-n строку, где i'th ячейка является выходом glcmcontrast в столбце i'th в A. Аналогично тому, как работают функции sum, mean и median.

Не все функции можно переписать для поддержки такого рода операций.

person zenpoy    schedule 11.03.2012
comment
Я думаю, что из-за особенностей расчета GLCM невозможно использовать функцию в сочетании с colfilt, так как необходимо сохранить пространственную ориентацию пикселей. Но спасибо за информацию! - person MBL; 13.03.2012