2

データ: 2000 行 x 500 列の行列があるとします (画像)

必要なもの: 上記のデータの 10 列のチャンクで 64 行の FFT を計算します。つまり、データ マトリックス全体で実行される 64X10 ウィンドウの FFT を計算したいと考えています。FFT の結果は、新しい「FFT 値」画像を作成するために使用されるスカラー値 (ピーク振幅周波数など) を計算するために使用されます。

ここで、最終的な FFT イメージを元のデータと同じサイズ (2000 X 500) にする必要があります。

MATLAB でこれを達成する最速の方法は何ですか? 現在、比較的遅い for ループを使用しています。また、補間を使用して、最終的な画像を元のデータ サイズにサイズアップします。

4

2 に答える 2

2

@EitanTが指摘したようblockprocに、画像のバッチブロック処理に使用できますがJ.、関数ハンドルを次のように定義する必要があります

fun = @(block_struct) fft2(block_struct.data);
B = blockproc(J, [64 10], fun);

[2000 x 500]行列の場合、これは[2000 x 500]複素フーリエ値の出力を提供し、ローカル サポート (FFT への入力のサイズ) を持つサブサンプリングされたピクセル位置で評価されます[64 x 10]。ここで、これらの値を 1 つの値 (たとえばピークの対数振幅) に置き換えるには、さらに指定できます。

fun = @(block_struct) max(max(log(abs(fft2(block_struct.data)))));
B = blockproc(J, [64 10], fun);

出力は、ブロックパッチ値の [2000/64 x 500/10] 出力であり、これは、最近傍補間 (またはより滑らかなバージョンの場合は別のもの) によって、目的の [2000 x 500] 元のサイズにサイズ変更できます。

C = imresize(B, [2000 500], 'nearest');

さらに役立つ場合は、実際の画像の例を含めることができます。

更新:オーバーラップ ブロックを取得するには、サイズの最終的なウィンドウのサイズが [64, 10] のままになるようにオーバーラップを設定する'Bordersize'オプションを使用できます。例:blockproc[V H][M + 2*V, N + 2*H]

fun = @(block_struct) log(abs(fft2(block_struct.data)));
V = 16; H = 3; % overlap values
overlap = [V H]; 
M = 32; N = 4; % non-overlapping values
B1 = blockproc(J, [M N], fun, 'BorderSize', overlap); % final windows are 64 x 10

ただし、これは上記の単一値バージョンではなく、完全なフーリエ応答を維持することで機能しmax(max())ます。

blockproc:「本当に大きい」画像の取り扱い: ブロック処理を使用したフィルタリングについては、この記事も参照してください。

于 2012-09-10T23:13:36.390 に答える
1

大きな行列内の個々の個別のブロックに同じ関数 (この場合は 2 次元フーリエ変換) を適用する場合はblkproc、新しい MATLAB リリースで に置き換えられた関数を使用してそれを行うことができますblockproc

fft2ただし、 「スライディング ウィンドウ」方式でオーバーラップ ブロックにapply を適用したいと考えています。この目的のためcolfiltに、'sliding'オプションを使用できます。各ブロックに適用している関数は fft であることに注意してください。

block_size = [64, 10];
temp_size = 5 * block_size;
col_func = @(x)cellfun(@(y)max(max(abs(fft2(y)))), num2cell(x, 1), 'Un', 0);
B = colfilt(A, block_size, 10 * block_size, 'sliding', col_func);

これはどのように作動しますか?各「スライド」ブロックを新しい一時行列の個別の列に再配置し、この新しい行列に を適用することによって、行列をcolfilt処理します。次に、各列を元のブロックに復元して適用し、各列の最大振幅値を返します。Acol_funccol_funcfft2

注意すべき重要事項:

  1. この一時的なマトリックスには、考えられるすべての「スライド」ブロックが含まれているため、メモリが制限される可能性があります。したがって、計算で使用するメモリを少なくするためにcolfilt、元の行列Aを のサブ行列にtemp_size分割し、それぞれに対して個別に計算を実行します。もちろん、結果の行列 B は同じままです。

  2. 結果の行列の各要素はB、対応するブロック近傍から計算されます。画像が大きいほど、処理する必要があるブロックが多くなるため、計算時間が幾何学的に増加します。MATLABが 2000 行 500 列の行列のすべてのスライディング ウィンドウの処理を完了するまで、かなり待たなければならないと思います。

于 2012-09-10T22:54:39.623 に答える