1

ブロックに分割し、各ブロックのヒストグラムを計算する必要がある画像があります。これを行う最善の方法は、blockproc() 関数を使用して各ブロックのヒストグラムを計算することだと思いますが、ヒストグラムはベクトルであり、さらに計算を高速化するために 3 次元に格納したいと考えています。

たとえば、1024*1024px の画像を 64*64px のブロックに分割し、hist() でヒストグラムを計算します。したがって、blockproc は 16*16 行列を返す必要があります。しかし、hist() が格納したいベクトルを返すことを考えると、blockproc() が 16*16*256 行列を返すようにしたいと思います。3 番目の次元はヒストグラムの 256 値です。

私の現在のコードは次のとおりです。

function [ counts ] = getHist( block )
    [counts,]=hist(block.data, 0:255);
end

HistA = blockproc(lbpA, [64 64], @(block_struct) getHist(block_struct));

ただし、(16*256) x 1024 の行列が返されます。

どうすればこれを達成できますか?

ありがとう!

4

1 に答える 1

1

私はここに Matlab を持っていないので、これはすべて未テストです。

blockprocドキュメントを読みました。2D (16*256) × (16) の行列 (またはその逆) が得られると思います。そして、16 x 16 x 256 のマトリックスが必要です。

shiftdimを使用してヒストグラムの出力を変更してみてください。ヒストグラムは、サイズが [1,256] の行ベクトルです。

output = shiftdim(output,-1)

これにより、[1,1,256] ベクトルが生成されます。

現在行っている列ごとではなく、ブロック内のすべてのピクセルの数が必要であると想定しています。64*64 ブロック行列をベクトルに再形成するとうまくいくと思います(:):

function counts = getHist(block)
    counts = hist(block.data(:), 0:255);
end
于 2013-03-06T16:55:01.853 に答える