使用colfilt滑动窗口操作

时间:2012-03-09 11:19:35

标签: matlab image-processing matrix glcm

我在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'参数一起使用来执行相同的操作。我的问题是我如何将函数glcmcontrastcolfilt一起使用。运行它会返回错误:

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 :(得分: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的方式类似,summean函数的工作方式相同。

并非所有功能都可以重写以支持此类操作。