【问题标题】:Color coding values in matrix矩阵中的颜色编码值
【发布时间】:2014-10-09 02:32:49
【问题描述】:

我有一个 500x500 的单元矩阵,每次迭代都会更新。我正在模拟随机过程,结果新值出现或消失。我想要做的是给值-10 一个固定的颜色代码(比如说绿色和蓝色)。所有其他值(从1 到矩阵中的最大值)可以是与包含-10 的单元格不同的颜色。可以为所有大于0 的值插入颜色。我知道caxis 函数,但这让我只排除-10 的值或从-1 开始进行插值。这个问题有什么解决办法吗?它也需要是一个快速的解决方案,因为每次迭代都会打印矩阵......

[解决方案]

tic
a = randi([-1,10],100,100);
cint = [-1,0,linspace(1,10,10)];
cmap = [0,0,1;0,1,0;autumn(10)];
[~,c] = histc(a,cint);
d = cmap(reshape(c,10000,1),:);
for k=1:3
    im(:,:,k) = reshape(d(:,k),100,100);
end
image(im)    
toc

【问题讨论】:

  • 我认为您的问题有点不清楚,因为您没有提供您正在处理/想要处理的单元矩阵的任何示例。我可能是错的,但我不能开始我建议你用单元矩阵重写问题,以便我们得到更好的图片。
  • 如果我理解正确,您可以为此创建一个自定义颜色图,只是保持初始范围的颜色不变:stackoverflow.com/questions/17230837/… 如果您走这条路线,我建议您预先选择一个最大(颜色)值并保持不变
  • 这里有点不清楚。您似乎在这里要求两件事并将它们相互混合。您提到要为值分配颜色以及要插入颜色。你对哪一个有问题?此外,“细胞矩阵”是否应该代表图像?在这种情况下,我建议您像 matlab 一样使用 3d 矩阵。
  • 矩阵包含 -1、0 和可变数量的正数。我想将矩阵打印为图像,其中 -1 值显示为绿色单元格,0 值显示为蓝色,所有其他值可以是插值颜色,但应该不同于 -1 和 0 单元格的颜色(它们不能是一样的颜色!)。所以说我的最大值是 500。如果我使用默认设置,matlab 将插值从 -1 到 500 的颜色。我想修复 -1 和 0 值的颜色,并从 1 开始用不同的颜色进行插值。 @Dan,似乎这就是我要找的。一会儿试试看!

标签: matlab loops matrix colormap


【解决方案1】:

好吧,既然你特别要求一个单元格。

a = randi([-1,10],10,10); % Generate a 10x10 matrix of random integers
a = num2cell(a);
b = [-1,0,linspace(1,10,5)]; % color interval
cmap = [0,1,0;0,0,1;hot(5)]; % colormap with 7 colors
[~,c] = cellfun(@(x) histc(x,b), a, 'un', false); % Find color index
imdataCells = cellfun(@(x) cmap(x,:), c,'un', false); % Get colors

我还没有测试创建数据的图像,但据我所知(通过查看数据并将 a 与区间进行比较)它应该可以工作。

编辑

要获得正确格式的图像数据,可以使用cellfun 转换图像数据

foo = zeros(size(a,1),size(a,2),3);
for k = 1:3
foo(:,:,k) = cellfun(@(x) x(k),imdataCells);
end

【讨论】:

  • 这似乎一直有效,直到我必须将单元格数组输出为颜色图。我怎样才能做到这一点?我试过cellfun(@colormap, imdataCells) cellfun(@image, imdataCells) 不起作用。我不想使用循环,因为它必须很快,而且我的原始矩阵包含从 200^2 到 500^2 的条目...
  • 顺便说一句,它不必是一个单元格。我想拥有一个包含 RGB 值的 3d 矩阵然后使用colormap 否更容易?
  • 颜色图是什么意思? cmap 是颜色图。那一个完全独立于您的数据。颜色图只指定您使用的颜色。您的意思是您想要正确格式的图像数据(3d 矩阵)吗?
  • @user3398082 我也这么认为,但 OP 要求提供一个单元格。我想否则你也会这样做,但没有 cellfun
  • 我对颜色图感到困惑。认为这是一个将具有 RGB 值的矩阵作为图像输出的命令。但它现在有效!我调整了您的代码,而不是使用单元阵列,而且这种方式似乎也更快(请参阅我的 OP)。感谢您的帮助!
【解决方案2】:

例如surf() 的第四个参数是值颜色的矩阵,您可以更改它或更改使用的颜色图。这种方法 simpy 为您的需求定义了一个颜色图:

% Your Data of -1's, 0's and positive values
cdata = num2cell(peaks(500));
cdata = cell2mat(cdata);
cdata(cdata<0) = -1;
cdata(cdata>0 & cdata <1) = 0;

% the plot
figure()
h = imagesc(cdata);

% the colors
N = 20; % number of colors for interpolation
blue2red = zeros(N,3);
for k = 1:N
    blue2red(k,:) =[k/N, 0, 1-k/N];
end

% adjust the colormap
cmap = zeros(N+2,3);
cmap(1,:) = [0,1,0]; % first is green (for -1)
cmap(2,:) = [0,0,1]; % second is blue (for 0)
cmap(3:end,:) = blue2red; % all the rest is an interpolation from blue to red
colormap(cmap)
colorbar

% Test the picture whilst values are updating
for k = 1:1000;
% Test the picture whilst values are updating
for k = 1:1000;
    old_cdata = get(h, 'CData');        
    cdata = old_cdata + (rand(size(cdata))-0.5)*0.1; % assume values get updated
    cdata(cdata<0) = 0; % assume positive values are at least 0
    cdata(old_cdata == -1) = -1; % assume -1 stays -1
    cdata(old_cdata == 0) = 0; % assume 0 stays 0
    set(h, 'CData', cdata);
    drawnow
end
end

【讨论】:

  • 嗯,这有点作弊,不是吗?没想到你会出现有史以来最丑陋的冲浪情节。此外,最初的假设是您调用的变量Z 必须是单元格而不是矩阵。这当然可以使用cell2mat 进行修改。但是,您的示例无法按预期工作。尝试用cmap(3:end,:) = hot(size(cmap(3:end,:),1));替换cmap(3:end,:) = blue2red;,你会看到。
  • @patrik 我不能听从你的批评。我更新了我的帖子并通过imagesc交换了冲浪并添加了更新图片的测试。我不认为它看起来像有史以来最丑陋的冲浪情节。它看起来和我预期的完全一样,就像我理解了这个问题一样。请赐教。
  • 冲浪是 3d 和随机的,3d 不能很好地结合在一起。但是你试过我的测试吗?这表明您提交的代码甚至没有按预期工作。 OP还特别要求提供颜色代码。我看不到,因此这不是答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2013-05-15
相关资源
最近更新 更多