带有多个比例尺的Matlab曲面图颜色图

时间:2018-09-21 10:46:37

标签: matlab surf colormap

我有以下一组跨[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, 它显示了中间的局部差异,但没有边缘。 我真的很想将两者结合起来。我和colormapeditor一起玩了很多,但是还没有找到令人满意的解决方案。

理想情况下,我会将颜色条划分为两个区域,一个蓝色区域从00.00023(中间区域的最大值),第二个黄色区域从{{1} }至0.00023(边缘区域的最大值)。 另外,也可以在两张图片上进行一些叠加(在2D中相当容易,但我也想在3D中做到这一点),但我更喜欢使用自定义颜色栏来解决。

有人知道该怎么做吗?

2 个答案:

答案 0 :(得分:0)

您可以代替绘制数据日志,例如

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));

编辑:您仍然需要弄乱颜色图编辑器,以使差异达到所解析数据范围的上限(黄色区域)。

答案 1 :(得分:0)

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

从高动态范围(HDR)摄影的角度来看,您要执行的操作有一个名称:色调映射。如何解决这个问题没有简单的答案。按照Amos的建议,对数据进行对数是一个很好的第一步。当查看高动态范围的信号频谱(例如图像的功率谱)时,通常会执行此操作,在这种情况下,由于功率谱和自然图像之间的统计联系,它通常更有效。

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

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

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