1

我在下面显示了一个函数,该函数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) = ...'

我从使用im2colcolfilt数组重塑为窗口大小和图像大小的文档中知道。问题是如何将我的函数重写为适用的格式?实际将函数应用于重构数组的行是(m*n)-by-((i-m+1)*(j-n+1))[m n][i j]glcmcontrastcolfiltcolfilt

b = reshape(feval(fun,x,params{:}), size(a));

但我完全不知道如何将我的功能应用于此。我认为这个问题与我的函数输出标量值有关,但我不确定..

4

1 回答 1

0

根据 colfilt 的文档:

'sliding' 将 A 的每个 m×n 滑动邻域重新排列为临时矩阵中的一列,然后将函数 fun 应用于该矩阵。 fun 必须为临时矩阵中的每一列返回一个包含单个值的行向量。(列压缩函数,如 sum 返回适当类型的输出。)然后 colfilt 将 fun 返回的向量重新排列成与 A 大小相同的矩阵。

因此,您应该更改glcmcontrast以能够接收m-by-n矩阵“A”并返回单元格是 中1-by-n列上i'th的输出的行。类似的方式,和功能的工作。glcmcontrasti'thAsummeanmedian

并非所有函数都可以重写以支持这种操作。

于 2012-03-11T15:39:28.377 回答