matlab中

时间:2017-05-09 20:01:25

标签: matlab image-processing histogram particle-filter

我有一个RGB图像(类型为uint8),我想执行以下过程:

  1. 将图像量化为16级(每层)
  2. 计算每个 RGB组合的直方图:首先我需要一个16 * 16 * 16矩阵来保存这些值 - 即如果我们表示直方图矩阵hist则{{1}应该保持直方图中的像素数量,强度等级为r = 2,g = 9,b = 3等。下一阶段是将其重塑为4096 * 1向量(但这是容易的部分)
  3. 现在我有以下实现:

    hist(2,9,3)

    这个实现有效,但它非常慢 - 我需要重复该过程100次(作为实现粒子滤波器的一部分),即使在大小为80的非常小的图像(实际上是图像部分)上执行它* 40需要很长时间。 我正在寻找一种更有效的方法来实现这一目标。谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用位移将RGB的4位值转换为12位值:

I = uint16(bitshift(I,-4));   % make sure the integer is large enough
twelvebit = bitshift(I(:,:,1),8) + bitshift(I(:,:,2)),4) + I(:,:,3);

这将产生如下所示的值:

0 0 0 0   R R R R   G G G G   B B B B
-------   -------   -------   -------
 unused     red      green      blue

现在您的值在[0..4095]范围内,您可以计算超过4096个柱子的直方图。

答案 1 :(得分:3)

我喜欢accumarray

function hist = compRGBHist(I)
    I = bitshift(I, -4); % quantize to 16 color levels
    R = I(:,:,1) + 1; % +1 to be in [1..16]
    G = I(:,:,2) + 1;
    B = I(:,:,3) + 1;
    A = accumarray([R(:), G(:), B(:)], 1, [16,16,16]);
    hist = reshape(A, 4096, 1);
end

PS:Beaker,bitshift解决方案可能是最好的。

答案 2 :(得分:1)

如果将uint8(0..255)除以2 ^ 4,则最终会得到(0..16)而不是(0..15)的范围。你应该首先减去2 ^ 3我认为,以确保你最终得到16个箱。

I = randi([0 255],512,512,3,'uint8'); %example data
I = (I-2^3)./2^4;
I = uint16(I);
I(:,:,2)=I(:,:,2)*2^4;
I(:,:,3)=I(:,:,3)*2^8;
I = sum(I,3,'native');
h=hist(I(:),[0:4095]);
h=reshape(h,[16 16 16]);