Операция со скользящим окном с использованием colfilt - PullRequest
1 голос
/ 09 марта 2012

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

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

1 Ответ

0 голосов
/ 11 марта 2012

В соответствии с документацией colfilt:

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

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

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

...