【问题标题】:Matlab blockproc store vector result as 3rd dimensionMatlab blockproc 将向量结果存储为第三维
【发布时间】:2013-03-06 14:57:53
【问题描述】:

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

例如,我有 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 矩阵。

我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • blockproc 返回什么?如果返回的元素个数没问题,后面就可以reshape了。
  • 我添加了一个代码示例,但它没有按预期工作。 @DedekMraz:它返回 (16*256) x 1024 矩阵,我什至不明白为什么它不返回 (16*256) x 16 矩阵?

标签: matlab image-processing matrix


【解决方案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

【讨论】:

  • 它不起作用,它说“Assignment 的 non-singleton rhs 维度比 non-singleton subscripts 多”
  • 嗯...再次出现尺寸问题-非常Matlab :) 你能告诉我getHist 输出的尺寸是多少(shiftdim 之前和之后)?可能是直方图已经返回了一个行向量,你应该只做shiftdim(output,-1)
  • 所以你从 2^20 像素开始。每个 64*64=2^12 个像素变成 256=2^8 个向量。所以输出应该有2^16,但是你说输出有1024*256*16=2^22个元素。问题:您的输入是矩阵,而不是向量。我猜 Matlab 制作了 64 个直方图,每列一个。这将解释尺寸。
  • 你是对的,实际上我应该使用 "counts=hist(block.data(:), 0:255)" 否则 hist 每列生成 1 个直方图。现在使用“shiftdim(counts,-1)”似乎没问题!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多