首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下采样颜色数

下采样颜色数
EN

Stack Overflow用户
提问于 2015-01-06 12:28:00
回答 1查看 211关注 0票数 0

我想用颜色绘制三维数据集。也就是说,每个点都有一个相关的rgb颜色。当我将scatter3用于此任务时,绘图过程非常缓慢。我已经搜索了其他选项,并从FileExchange中获得了函数FileExchange:

然而,该函数只能通过索引引用某些颜色图来绘制每个点的颜色,并且不能直接获取rgb值。此外,它还多次使用plot3进行绘图,当颜色映射太大时,绘图速度也会非常慢。

所以,我在想:

是否有一个函数可以减少颜色的数量?也就是说,我把一个Nx3RGB-Array传递给函数,函数返回索引和一个新的数组A,其中size(A,1) < NA(indices,:)是新的近似颜色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-07 18:58:09

是的,在核心Matlab:rgb2ind中有这样一个函数。它的目的是通过索引图像来近似真实颜色图像,因此我们必须稍微修改一下才能使它工作。

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

代码语言:javascript
复制
scatter3(xyz(:,1), xyz(:,2), xyz(:,3), 4, rgb)

N= 100000 (在我的机器上)大约需要21秒。

如果ncol是用于逼近的不同颜色的数目,那么这就实现了这样的效果:

代码语言:javascript
复制
% 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并不是真正的图像,因此空间误差扩散在这里是没有意义的。现在可以使用

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27798701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档