2016-01-12 1 views
5

Blockprocは、MATLABの画像を「グリッディング」するための本当に便利な関数です。それはかなりよく文書化されており、さらにtutorial pageが付いています。しかし、ブロック間で何らかのオーバーラップが必要な場合は、処理が難しくなります。 Mathworksのフォーラムにはthis onethis 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 = [] 

答えて

5

なぜ私は 'BorderSize'(すなわち、オーバーラップタイル)を含むようにしたいだろうが、 が出力にそれを適用していませんか?

あなたは、画像内のサイズM×N個の各ブロックに機能funを適用したいすべてのワークフローを考えてみたが、結果が有効であるためには、あなたが実際にM×N個のブロックの周りの境界ピクセルを必要とします。 (フィルタリング、形態、1つの出力ピクセル値が周辺のmxnに依存する任意の関数)。つまり、1つのMxN出力ブロックを計算するために、(M + m、N + n)ブロックの入力が必要です。

シンプル(別名madeup)例:

h = fspecial('gaussian', 3); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h)); 
imshowpair(im, B1,'montage'); 

enter image description here

お知らせグリッド線?この特定のケースでは、フルイメージでimfilterを呼び出すだけです。しかし、blockprocを使うと、物理メモリよりも大きなイメージを扱うことができます。この議論のために、imは巨大なtiffファイルだと想像してください。このワークフローの

- あなただけのをブロック20×20の各周りに3つのピクセルの境界線を含めるためにBorderSizeを使用してが出力ボーダートリムないをした場合:だから

h = fspecial('gaussian'); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', false); 
imshowpair(im, B1,'montage'); 

enter image description here

を - あなたを境界をトリムする必要があります(デフォルト)

h = fspecial('gaussian'); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', true); 
imshowpair(im, B1,'montage'); 

enter image description here

注: - 例としてIMFILTERを使用しました。小さな画像の場合は、IMFITLERを直接使用します。大きい画像の場合のみ、BLOCPROCでIMFITLERを使用することを検討してください。ちょうどあなたが重複ブロックを取得し、= IT-

function cropSaveBlock(bs,ii) 
    subBlockRegion =(bs.data(:,:)); 
    fileName = [strrep(num2str(bs.location,ii),' ','_') '.jpg']; 
    imwrite(subBlockRegion, fileName); 
    end 
    a = imread('cameraman.tif'); 

IIを節約するために探している場合で

+0

のないA-、bordersizeはX、Y 10、10の全体像です。一般に、ブロック関数の出力ブロックが入力ブロックで同じサイズであると想定されている場合は、おそらく境界をトリミングする必要があります。あなたのブロック機能が基本的に出てくるデータを変更している場合(ブロック全体を取り込んでスカラー値を返す場合のように)、境界をトリミングしたくない場合があります。 本当の魔法はありません。 TrimBorderがtrueに設定されている場合、ブロック関数が出力を返した後、境界線のサイズで「トリムされます」。あなたのケースでは、あなたの全体の出力は "トリミング"されました。 – brendan

+0

これは非常に詳細な回答です、ありがとうございます!あなたは私の "悪い"例の行動を説明することはできますか? 'TrimBorder'をonにすると、空の行列出力になるのはなぜですか? – marcman

+0

申し訳ありませんが、私はそれに対処することを忘れました。その基本的に@brendanは上記の通りです - TrimBorder = trueは、関数の出力からBordersize([1 1])を '削除'しようとします。これは既にスカラーであり、したがって実際の出力は[]です! –

0

[uはファイル名を欲しい1-何でも]%[1時20分]あなたの画像を20個の結果のブロックを持っている場合ここ

aa=blockproc(a, [257 257], @(bs)cropSaveBlock(bs,ii),'BorderSize', [10 10 ]) 

%これは素晴らしい答えであるブロック