【问题标题】:Downsample number of colors下采样颜色数
【发布时间】:2015-03-04 02:56:23
【问题描述】:

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

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

所以,我想知道:

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

【问题讨论】:

  • 你确定缓慢与颜色有关,而不仅仅是点数?您能否提供一些示例代码,您是如何使用scatter3 做到这一点的?
  • 我很确定,运行时与 plot3k 中的颜色数量有关。但是,在 scatter3 中,点数是重要因素。也许有一个混乱?要为点云“pcl”运行 scatter3,其中前三列是 x、y、z,第 4 到 6 列是 RGB,我使用了: scatter3(pcl(:,1), pcl(:,2), pcl(:, 3), 4, pcl(:,4:6)
  • 好的,我可以确认。对于 100,000 个点,如果每个点具有不同的颜色,则 scatter3 需要 20.7 秒,如果它们都具有相同的颜色,则需要 1.29 秒。奇怪...

标签: matlab plot matlab-figure


【解决方案1】:

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

我假设xyzN x 3 坐标数组,rgbN 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 空间中进行最小方差量化,这意味着它只考虑近似值中的数值相似性,而不考虑视觉相似性。应该可以通过使用另一个颜色空间进行近似来改进结果,例如CIE L*a*b*

【讨论】:

  • 我用相同的功能玩了一下,但没有让它正常工作。感谢您展示有效的解决方案! :)
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2015-02-20
  • 2020-02-18
  • 2012-05-20
  • 1970-01-01
  • 2016-02-14
相关资源
最近更新 更多