下采样颜色数

Downsample number of colors

我想用颜色绘制 3D 数据集。也就是说,每个点都有一个关联的 rgb 颜色。当我使用 FileExchange 中的 scatter3 for this task, the plotting process is veeeeery slow. I have searched for alternative options and came up with the function plot3k 时:

然而,此函数只能通过索引引用某些颜色图来绘制每个点的颜色,而不能直接获取 rgb 值。此外,它反复使用 plot3 进行绘图,当颜色图太大时,绘图也会变得非常慢。

所以,我想知道:

是否有减少颜色数量的功能?即,我将 N x 3 RGB 数组传递给函数和函数 returns 索引和一个新数组 A,其中 size(A,1) < NA(indices,:) 是新的近似颜色.

是的,核心Matlab中有这样一个函数:rgb2ind。它的目的是通过索引图像来近似真彩色图像,因此我们必须 fiddle 一点才能使其工作。

我假设 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');

结果是颜色图 map 中的整数颜色索引序列 indnodither 选项是必需的,因为我们的 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-space中做最小方差量化,意味着它在近似时只考虑数值相似性,而不考虑视觉相似性。应该可以通过使用另一种颜色 space 进行近似来改善结果,例如 CIE L*a*b*.