我想用颜色绘制三维数据集。也就是说,每个点都有一个相关的rgb颜色。当我将scatter3用于此任务时,绘图过程非常缓慢。我已经搜索了其他选项,并从FileExchange中获得了函数FileExchange:
然而,该函数只能通过索引引用某些颜色图来绘制每个点的颜色,并且不能直接获取rgb值。此外,它还多次使用plot3进行绘图,当颜色映射太大时,绘图速度也会非常慢。
所以,我在想:
是否有一个函数可以减少颜色的数量?也就是说,我把一个Nx3RGB-Array传递给函数,函数返回索引和一个新的数组A,其中size(A,1) < N和A(indices,:)是新的近似颜色。
发布于 2015-01-07 18:58:09
是的,在核心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序列转化为彩色映射map。nodither选项是必要的,因为我们的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 。
https://stackoverflow.com/questions/27798701
复制相似问题