【问题标题】:Matlab surface plot colormap with multiple scales具有多尺度的 Matlab 曲面图颜色图
【发布时间】:2018-09-21 10:46:37
【问题描述】:

我有以下跨越 [x,y] 域的示例数据集:

test=[2.58,2.2, 0.00023, 0.000163, 0.000123, 0.000164, 0.00022,   2.18, 2.56,2.56; 
 2.46,2.17, 0.00021, 0.000150, 0.000119, 0.000141, 0.00020,  2.16, 2.43, 2.56; 
 2.35,2.14, 0.00019, 0.000143, 0.000101, 0.000136, 0.00018,  2.14, 2.36,2.56; 
2.23,2.12,  0.000184, 0.000138, 0.000095, 0.000124, 0.000166, 2.12, 2.24,2.56; 
 2.2,2.11, 0.000177, 0.000141, 0.00009, 0.000101, 0.000156,  2.09, 2.18, 2.56; 
 2.25,2.1, 0.000176, 0.000168, 0.00008, 0.000095, 0.000164, 2.08, 2.26, 2.56; 
 2.32,2.13, 0.000183, 0.000178, 0.000086, 0.000104, 0.000177,  2.11, 2.35,2.56; 
2.44, 2.15, 0.00019, 0.000191, 0.000099, 0.000112, 0.000189,  2.13, 2.44,2.56; 
 2.56, 2.17,0.00021, 0.000199, 0.000101, 0.000132, 0.000199,  2.15, 2.52,2.56; 
 2.59, 2.19, 0.00022, 0.000209, 0.000118, 0.000144, 0.00021, 2.19,2.55, 2.56]

如您所见,边缘的数据远高于中间的数据,即有两种不同的尺度。使用 Matlab 曲面图 (surf(test)) 我可以选择关注边缘,通过在2.6 上设置颜色图最大值,我得到: Focus on the edges。 这很好地显示了边缘的局部差异,但中间部分没有可见的差异。

或者,我可以通过将最大值设置为 0.00025 来专注于中间,我得到: Focus on the middle, 它显示了中间的局部差异,而不是边缘的局部差异。 我真的很想将两者结合起来。我玩了很多颜色映射编辑器,但还没有找到令人满意的解决方案。

理想情况下,我会将颜色条分为两个区域,一个蓝色区域从00.00023(中间区域的最大值),第二个黄色区域从0.000232.59(边缘区域的最大值)。 或者,两张图片的一些叠加是可能的(在 2D 中相当容易,但我也想在 3D 中这样做),但我更喜欢使用自定义颜色条来解决它。

有人知道怎么做吗?

【问题讨论】:

  • “如你所见,数据.....”你把它都放在这里希望我们直观地找到分号并计数?付出努力,并显示有问题的数据。我没有进一步阅读,只是看到原始数据和你的第一行英文。
  • 如果您已经努力编写此评论以进一步阅读,您会看到实际上附加的图像可以让您免于阅读数据。唯一的事情是他们隐藏在一个链接中,在我有足够的声誉之前我无法做任何事情。我认为为此给我减分是不公平的,也无助于我获得足够的声誉来发布图片。如果您撤消它,我将不胜感激,所以希望下次我可以发布清晰的图像。
  • 那里,看起来更好,所以赞成。
  • 考虑在下面接受我的回答。这是一个很好的问题,答案可以使社区受益。

标签: matlab surf colormap


【解决方案1】:

您遇到的问题是高动态范围数据。一般没有办法解决这个问题。

从高动态范围 (HDR) 摄影的角度来看,您要求做的事情有一个名称:色调映射。如何解决这个问题没有简单的答案。按照 Amos 的建议,对数据取对数是很好的第一步。这通常在查看高动态范围的信号光谱(例如图像的功率谱)时完成,由于功率谱和自然图像之间的统计联系,它更普遍地起作用。

您可以做的第二种方法(很简单)是将gamma-correction 应用于您的图像。这为您提供了一个可以调整的简单参数,并且对于一些 2D 数据就足够了。

正如您自己指出的那样,对数(或伽马校正)通常不会根据您的需要重新调整您的数据。这就是为什么色调映射仍然是一个开放的研究领域的原因之一。

话虽如此,有一些全自动的方法,一些是在 Matlab 中实现的。这是I have never tried myself, but supported by mathworks

【讨论】:

    【解决方案2】:

    您可以改为绘制数据日志,例如

    surf(log(test))
    caxis(log([min(test(:)) max(test(:))]));
    colorbar_array = linspace(log(min(test(:))), log(max(test(:))), 5);
    colorbar('FontSize',11,'YTick',colorbar_array,'YTickLabel',exp(colorbar_array));
    

    编辑:您仍然需要使用颜色图编辑器来解决数据范围上限(黄色区域)的差异。

    【讨论】:

    • 是的,我确实试过了!我认为对于我给出的示例确实有效,但是我有一些示例,其中值的差异甚至超过了我需要扩展索引并查看是否有效的示例。可能需要多玩一些,谢谢! :)