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) = ...'
ドキュメントから、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));
しかし、これに自分の関数を適用する方法については完全に迷っています。この問題は、関数がスカラー値を出力することに関係していると思いますが、よくわかりません。