我在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));
但我完全迷失了如何将我的功能应用于此。我认为这个问题与我输出标量值的函数有关,但我不确定..
答案 0 :(得分:0)
根据colfilt的文档:
'sliding'将A的每个m-by-n滑动邻域重新排列为a中的一列 临时矩阵,然后将函数fun应用于此矩阵。 fun必须返回包含每列唯一值的行向量 在临时矩阵中。 (列压缩 sum等函数 返回适当类型的输出。)colfilt然后重新排列 有趣地将矢量返回到与A相同大小的矩阵中。
因此,您应该更改glcmcontrast
以便能够接收m-by-n
矩阵'A'并返回1-by-n
行,其中i'th
单元格是glcmcontrast
的输出在i'th
的{{1}}列上{1}}。与A
的方式类似,sum
和mean
函数的工作方式相同。
并非所有功能都可以重写以支持此类操作。