我有以下一组跨[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一起玩了很多,但是还没有找到令人满意的解决方案。
理想情况下,我会将颜色条划分为两个区域,一个蓝色区域从0
到0.00023
(中间区域的最大值),第二个黄色区域从{{1} }至0.00023
(边缘区域的最大值)。
另外,也可以在两张图片上进行一些叠加(在2D中相当容易,但我也想在3D中做到这一点),但我更喜欢使用自定义颜色栏来解决。
有人知道该怎么做吗?
答案 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。