Blockproc
は、MATLABの画像を「グリッディング」するための本当に便利な関数です。それはかなりよく文書化されており、さらにtutorial pageが付いています。しかし、ブロック間で何らかのオーバーラップが必要な場合は、処理が難しくなります。 Mathworksのフォーラムにはthis oneとthis oneなどの説明があり、説明はhere(質問#1)ですが、実際には特定のフラグを他のフラグと一緒に設定する必要がある場所については説明しません。誰かが'BorderSize'
パラメータの目的が何であるか説明してください。それは'Trim Borders'
がfalse
に設定されている場合、'BorderSize'
パラメータは、ドキュメントが言うまさにないようだ(とあなたが期待するもの):MATLABのblockproc関数 'BorderSize'と 'TrimBorder'
「BorderSize」:2要素ベクトル[VH]、指定各ブロックに追加する境界ピクセルの量。この関数は、各ブロックの上下にV行を追加し、各ブロックの左右にH列を追加します。結果ブロックのサイズは、[M + 2 * V、N + 2 * H]
です。デフォルトでは、この関数は自動的に境界線を削除します。詳細については、TrimBorderパラメータを参照してください。この関数は、画像のエッジを越えてゼロを含む罫線をブロックします。
しかし、あなたは'TrimBorder'
詳細を読んだとき、それははるかにアップクリアしません:
'TrimBorder':論理スカラー。 trueに設定すると、blockproc関数は、ユーザー関数funの出力からボーダーピクセルをトリミングします。この関数は、funの出力の上下からV行を削除し、左右の端からH列を削除します。 'BorderSize'パラメータはVとHを定義します。デフォルトはtrueです。つまり、blockproc関数は自動的にfun出力からボーダーを削除します。
'BorderSize'
(オーバーラップタイル)を含めるが、出力に適用しないのはなぜですか?これはあまり説明されていないフラグです:'TrimBorder'
をオフにして'BorderSize'
を使用する必要がありますか、それとももっと大きなものがありますか?私は私の混乱の要点だと思います:いつ'TrimBorder'
をfalse
に設定したいですか?
例:
% Non-overlapping
A = ones(10);
B = blockproc(A, [2,2], @(x)sum(sum(x.data)));
% B =
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% GOOD Overlapping--one-pixel border
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1], 'TrimBorder', false);
% B =
% [ 9 12 12 12 9 ]
% [ 12 16 16 16 12 ]
% [ 12 16 16 16 12 ]
% [ 12 16 16 16 12 ]
% [ 9 12 12 12 9 ]
% BAD Overlapping--one-pixel border
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1]);
% B = []
のないA-、bordersizeはX、Y 10、10の全体像です。一般に、ブロック関数の出力ブロックが入力ブロックで同じサイズであると想定されている場合は、おそらく境界をトリミングする必要があります。あなたのブロック機能が基本的に出てくるデータを変更している場合(ブロック全体を取り込んでスカラー値を返す場合のように)、境界をトリミングしたくない場合があります。 本当の魔法はありません。 TrimBorderがtrueに設定されている場合、ブロック関数が出力を返した後、境界線のサイズで「トリムされます」。あなたのケースでは、あなたの全体の出力は "トリミング"されました。 – brendan
これは非常に詳細な回答です、ありがとうございます!あなたは私の "悪い"例の行動を説明することはできますか? 'TrimBorder'をonにすると、空の行列出力になるのはなぜですか? – marcman
申し訳ありませんが、私はそれに対処することを忘れました。その基本的に@brendanは上記の通りです - TrimBorder = trueは、関数の出力からBordersize([1 1])を '削除'しようとします。これは既にスカラーであり、したがって実際の出力は[]です! –