我在下面显示了一个函数,该函数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) = ...'
我从使用im2col将colfilt
数组重塑为窗口大小和图像大小的文档中知道。问题是如何将我的函数重写为适用的格式?实际将函数应用于重构数组的行是(m*n)-by-((i-m+1)*(j-n+1))
[m n]
[i j]
glcmcontrast
colfilt
colfilt
b = reshape(feval(fun,x,params{:}), size(a));
但我完全不知道如何将我的功能应用于此。我认为这个问题与我的函数输出标量值有关,但我不确定..