我有一个RGB图像(类型为uint8),我想执行以下过程:
hist
则{{1}应该保持直方图中的像素数量,强度等级为r = 2,g = 9,b = 3等。下一阶段是将其重塑为4096 * 1向量(但这是容易的部分)现在我有以下实现:
hist(2,9,3)
这个实现有效,但它非常慢 - 我需要重复该过程100次(作为实现粒子滤波器的一部分),即使在大小为80的非常小的图像(实际上是图像部分)上执行它* 40需要很长时间。 我正在寻找一种更有效的方法来实现这一目标。谢谢!
答案 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]);