1

我有图像需要分成块,然后为每个块计算直方图。我认为最好的方法是使用 blockproc() 函数计算每个块的直方图,但直方图是一个向量,我想将它存储在第三维中,以便更快地进行进一步的计算。

例如,我有 1024*1024px 的图像,我将其划分为 64*64px 的块,并使用 hist() 计算直方图。所以 blockproc 应该返回一个 16*16 的矩阵。但是鉴于 hist() 返回一个我想要存储的向量,我想让 blockproc() 返回一个 16*16*256 矩阵,第三维是我的直方图的 256 个值。

我当前的代码是:

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

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

但它返回 (16*256) 乘以 1024 矩阵。

我怎么能做到这一点?

谢谢!

4

1 回答 1

1

我这里没有 Matlab,所以这一切都未经测试。

我已经阅读了blockproc文档。我认为您会得到一个 2D (16*256) x (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 回答