如何为表面着色以具有更强的对比度

2023-12-19

在Matlab中,我尝试使用以下代码在2维欧几里得空间上绘制一个函数

s=.05;
x=[-2:s:2+s];
y=[-1:s:3+s];
[X,Y]=meshgrid(x,y);
Z=(1.-X).^2 + 100.*(Y-X.*X).^2;
surf(X,Y,Z)
colormap jet

这是我的情节:

I hope to color the surface with stronger contrast, just as Wikipedia http://en.wikipedia.org/wiki/File:Rosenbrock_function.svg shows enter image description here

维基百科中的图是用Python代码绘制的:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = Axes3D(fig, azim = -128, elev = 43)
s = .05
X = np.arange(-2, 2.+s, s)
Y = np.arange(-1, 3.+s, s)
X, Y = np.meshgrid(X, Y)
Z = (1.-X)**2 + 100.*(Y-X*X)**2
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, norm = LogNorm(), cmap = cm.jet)

plt.xlabel("x")
plt.ylabel("y")

plt.show()

我的Matlab代码和维基百科Python代码似乎都使用“jet”作为颜色图,但它们的高度值到颜色的实际映射是不同的。所以我想知道如何在Matlab中获得类似的颜色?

感谢致敬!


您可以通过以下方式获得类似的外观:

  • 设置'EdgeColor'财产 https://www.mathworks.com/help/matlab/ref/matlab.graphics.chart.primitive.surface-properties.html#property_d119e930164表面物体的'none'去除边缘着色。
  • 修改'CData'财产 https://www.mathworks.com/help/matlab/ref/matlab.graphics.chart.primitive.surface-properties.html#property_d119e931462的表面来模仿颜色数据的对数缩放 http://matplotlib.sourceforge.net/api/colors_api.html#matplotlib.colors.LogNorm在Python代码中。

以下是修改代码的方法:

s = .05;
x = [-2:s:2+s];
y = [-1:s:3+s];
[X, Y] = meshgrid(x, y);
Z = (1.-X).^2 + 100.*(Y-X.*X).^2;
minZ = min(Z(:));  % Find minimum value of Z
maxZ = max(Z(:));  % Find maximum value of Z
C = minZ+(maxZ-minZ).*log(1+Z-minZ)./log(1+maxZ-minZ);  % Create a log-scaled
                                                        %   set of color data
surf(X, Y, Z, C, 'EdgeColor', 'none');
colormap jet

这是结果图:


对数缩放如何工作...

对数尺度Z用于生成颜色数据的数据C使更多表面点使用喷射颜色贴图的红橙色范围,从而提高该特定表面的对比度。可以通过这个简单的示例来直观地了解其工作方式:

x = 0:5:100;        % Create a range of values from 0 to 100
plot(x, x, 'b-*');  % Plot the values as a straight line (y = x) in blue
hold on;            % Add to the plot
plot(x, 100.*log(1+x)./log(101), 'r-*');  % Plot a log-scaled version of x in red
colorbar            % Display the default jet color map, for comparison

原始蓝点均匀分布在右侧颜色条中对应的颜色范围内。当对数缩放时,这些点向上移动到红线。请注意,这如何导致较低的蓝绿色范围内的点密度降低和红橙色范围内的点密度增加。


总的来说,对比度变得更好......

对于此处使用的特定表面,颜色数据的对数缩放有助于在表面上的所有点上使用更大范围的颜色图。由于有许多点处于较低的高度(即颜色索引)值,因此对数缩放将这些低点扩展得更多,以便在表面的大槽中使用更广泛的颜色。

但是,如果您想通过更好地利用颜色图的范围来提高任意表面的对比度,对数缩放并不总是有效。可能效果更好的通用解决方案是将表面的所有高度值按升序排序,然后将它们映射到跨越整个颜色图的线性范围。如果您对上面的表面执行此操作,您将得到以下结果:

C = Z;
[~, index] = sort(C(:));
C(index) = 1:numel(index);
h = surf(X, Y, Z, C, 'EdgeColor', 'none');
colormap jet
caxis([1 numel(index)]);

这通常应该比C = Z默认表面颜色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为表面着色以具有更强的对比度 的相关文章

随机推荐