下采样数量

时间:2015-01-06 12:28:01

标签: matlab plot matlab-figure

我想用颜色绘制3D数据集。也就是说,每个点都有一个相关的rgb颜色。当我使用scatter3执行此任务时,绘图过程非常缓慢。我搜索了其他选项,并从FileExchange中找到了函数plot3k

但是,此功能只能通过索引引用某些色彩图来绘制每个点的颜色,并且不直接获取rgb值。此外,它重复使用plot3进行绘图,当色彩图太大时,绘图也会非常慢。

所以,我想知道:

是否有下采样颜色数量的功能?即,我将N x 3 RGB数组传递给函数,函数返回索引和新数组A,其中size(A,1) < NA(indices,:)是新的近似颜色。

1 个答案:

答案 0 :(得分:1)

是的,核心Matlab中有这样一个功能:rgb2ind。它的目的是通过索引图像来逼近真彩色图像,所以我们必须摆弄一下才能使它工作。

我认为xyz是一个N x 3坐标数组,rgb是一个N x 3颜色数组。如果所有颜色都不同,

scatter3(xyz(:,1), xyz(:,2), xyz(:,3), 4, rgb)
N = 100000(在我的机器上)

大约需要21秒。

如果ncol是用于近似的不同颜色的数量,那么这就行了:

% convert colors from 0–1 double format to 0–255 uint8 format
rgb = uint8(floor(rgb * (256 - eps)));
% give the color array the form of a truecolor image (N x 1 x 3)
rgb = permute(rgb, [1 3 2]);
% reduce the number of colors
[ind, map] = rgb2ind(rgb, ncol, 'nodither');

结果是颜色映射ind中的整数颜色索引序列mapnodither选项是必要的,因为我们的rgb实际上不是图像,因此空间误差扩散在这里没有意义。现在可以使用

绘制数据
scatter3(xyz(:,1), xyz(:,2), xyz(:,3), 4, ind)
colormap(map)
caxis([0 ncol] - 0.5)    % ensure the correct 1:1 mapping

对于ncols = 100,颜色转换和绘图一起需要大约1.4秒,加速15倍!

rgb2ind在RGB空间中进行最小方差量化,这意味着它仅考虑其近似中的数值相似性,而不考虑视觉相似性。应该可以通过使用另一个颜色空间进行近似来改善结果,例如CIE L*a*b*