2012-03-09 10 views
1

У меня есть функция show below glcmcontrast, которая применяется к изображению в режиме раздвижного окна с использованием nlfilter.Работа скользящего окна с использованием colfilt

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 х 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)); 

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

+0

Возможно, это не из темы, но вы проверили [векторную версию GLCM] (http://www.mathworks.com/matlabcentral/fileexchange/22354-glcmfeatures4-m-vectorized-version-of-glcmfeatures1-m -с-код-изменения)? – zenpoy

+0

Да, у меня есть. Фактический расчет GLCM с использованием функции matlab [graycomatrix] (http://www.mathworks.co.uk/help/toolbox/images/ref/graycomatrix.html) - это момент, когда мой код замедляется. Код, с которым вы связаны, предназначен для вычисления функций из GLCM, после того, как GLCM был рассчитан с использованием graycomatrix. – MBL

ответ

0

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

'sliding' Rearranges each m-by-n sliding neighborhood of A into a column in a temporary matrix, and then applies the function fun to this matrix. fun must return a row vector containing a single value for each column in the temporary matrix. (Column compression functions such as sum return the appropriate type of output.) colfilt then rearranges the vector returned by fun into a matrix the same size as A.

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

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

+0

Я думаю, что из-за природы способа вычисления GLCM невозможно использовать эту функцию в сочетании с colfilt, поскольку пространственная ориентация пикселей должна быть сохранена. Спасибо за информацию, хотя! – MBL

 Смежные вопросы

  • Нет связанных вопросов^_^