MATLAB:颜色显示不正确?

Ame*_*ina 5 matlab matlab-figure

我注意到MATLAB有时会错误地显示我的颜色.我不确定这是否是我的编程错误,或者它是否是MATLAB中的实际错误.在过去一年左右的时间里,我注意到这种行为具有一定的规律性.

这一次,我决定拍摄一张有关错误的图片的快照(在Windows 7,64位的MATLAB 2011b上拍摄):

                                   在此输入图像描述

显示相关图像的代码如下:

figure;
clf;
cla;
imshow(matrix, []);
colormap(cmap);
set(gca, 'Clim', [0 highest_index]);
Run Code Online (Sandbox Code Playgroud)

哪里:

  • matrix是类型的uint32(虽然我还试图explitly铸造matrixdouble之前调用imshow)
  • matrix范围内的值0900
  • cmap901条目
  • highest_index900

该值的RGB条目259matrix[1, 0, 0.1]上方和颜色表阵列中的图像二者中cmap的,即cmap(300, :) = [1, 0, 0.1](注意到矩阵值259获得索引300在颜色表中,由于颜色表的第一条目是用于矩阵值0).

问题:

为什么会这样?这是一个错误吗?有什么我做错了吗?

更新1:

  1. 我尝试切换CDataMappingdirectscaled,但它没有任何区别.
  2. 我也尝试使用imagesc而不是imshow,但它并没有什么区别.
  3. 如果我首先将图像转换为RGB(indexed image即将true color图像转换为图像; 请参阅此处以获取更多信息),即使用i_rgb = ind2rgb(i_indexed, cmap),错误消失并且图像正确显示.

    不幸的是,如果我显示true color图像,数据提示不再显示每种颜色的原始矩阵中的索引,而是仅显示RGB矢量(即这是合乎逻辑的,因为MATLAB不再知道原始索引).

更新2:

这是一些示例代码:

h_f = figure(1);
clf;
i_spiral = spiral(40);
h_i = image(i_spiral);

% Synthesize a colormap first in HSV and then transform it to RGB:
max_i_spiral = max(i_spiral(:));
m           = max_i_spiral;
h           = (0:m-1)'/max(m,1);
cmap_spiral = hsv2rgb([h ones(m,2)]);  
colormap(cmap_spiral);

% If I comment out the following two lines or use imshow instead of image, 
% it makes no difference (I still get the same error):
set(gca, 'Clim', [1 max_i_spiral]);
set(h_i, 'CDataMapping', 'direct');
Run Code Online (Sandbox Code Playgroud)

上面的代码导致:

            在此输入图像描述

Ita*_*atz 8

[由于这个答案与我之前的答案完全无关,我不是第一个编辑的]

您提到的链接(http://www.mathworks.com/help/matlab/creating_plots/image-types.html)说:

注意 在Windows平台上使用painters渲染器时,在尝试显示索引图像时应该只使用256种颜色.较大的色彩映射可能会导致意外的颜色,因为画家算法使用Windows 256调色板,已知图形驱动程序和图形硬件的处理方式不同.要解决此问题,请根据需要使用Zbuffer或OpenGL渲染器.有关MATLAB中图形渲染器的更多信息,请参阅技术说明1201:图形渲染和故障排除技术支持指南.

所以似乎问题是你的色彩映射有超过256个值.它还解释了为什么如果不使用索引图像,问题就会消失.尝试使用不同的渲染器,如说明中的技术支持链接所示:

set(gcf, 'Renderer', 'opengl')
Run Code Online (Sandbox Code Playgroud)

要么

set(gcf, 'Renderer', 'Zbuffer')
Run Code Online (Sandbox Code Playgroud)