下采样颜色数
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) < N
和 A(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
中的整数颜色索引序列 ind
。 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-space中做最小方差量化,意味着它在近似时只考虑数值相似性,而不考虑视觉相似性。应该可以通过使用另一种颜色 space 进行近似来改善结果,例如 CIE L*a*b*.
我想用颜色绘制 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) < N
和 A(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
中的整数颜色索引序列 ind
。 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-space中做最小方差量化,意味着它在近似时只考虑数值相似性,而不考虑视觉相似性。应该可以通过使用另一种颜色 space 进行近似来改善结果,例如 CIE L*a*b*.