colfiltのドキュメントには下記のように書いています。
- まず、colfilt は A の m 行 n 列の各近傍を、関数 im2col を使用して一時行列の列に再配置します。
- 次に、colfilt は関数 fun をこの一時行列に適用します。fun は、一時行列の各列の単一値を含む行ベクトルを返さなければなりません (sum などの列圧縮関数は適切なタイプの出力を返します)。
- 最後に、colfilt は fun で返されるベクトルを、関数 reshape を使用して A と同じサイズの行列に形状を変更します。
どういうことかというと例えば入力する画像が100x100の大きさだったとして、colfilt(A,[5 5],'sliding',fun)を実行すると、
- まずim2colにより、大きさ25x10000の配列ができます。これは、行方向に各ブロックの値が1列に並び替えられてできたものです。slidingを指定しているので、となり合う列同士で値の重複は結構あります。
- そのあとこの配列に例えばsumみたいな列圧縮関数(何も引数を指定しないと列ごと行方向に和をとって一つの値が計算される)を処理すると、結果1x10000の配列ができます。
- これをreshapeで100x100に形を直すことで、スライディングブロックごとに和を取った結果の配列ができます。
ということで、エラーが出る理由はstd2関数を使っているからです。std2を使うと2次元配列の全ての値を使って標準偏差が計算されるので、上記で言うと25x10000の配列が1x1の大きさに圧縮されてしまいます。そのあと100x100にreshapeできなくなってしまうのでエラーが出ます。std2ではなくstdを使えば大丈夫のはずです。