1

nlfilterglcmcontrastを使用したスライディングウィンドウ操作で画像に適用される関数showを以下に示します。

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) = ...'

ドキュメントから、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 は、一時行列の各列に 1 つの値を含む行ベクトルを返さなければなりません( sum などの列圧縮関数は、適切なタイプの output を返します。) 次に、colfilt は fun によって返されたベクトルを A と同じサイズの行列に再配置します。

したがって、行列 'A'glcmcontrastを受け取り、セルが の列の出力である行を返すように変更する必要があります。と同様に機能します。m-by-n1-by-ni'thglcmcontrasti'thAsummeanmedian

この種の操作をサポートするために、すべての関数を書き直すことができるわけではありません。

于 2012-03-11T15:39:28.377 に答える