MATLAB: Цвета отображаются неправильно?

Я заметил, что MATLAB иногда неправильно отображает мои цвета. Я не уверен, что это ошибка программирования на моей стороне или это настоящая ошибка в MATLAB. Я заметил такое поведение с некоторой регулярностью в течение последнего года или около того.

На этот раз я решил сделать снимок фигуры с рассматриваемой ошибкой (сделанный на MATLAB 2011b в Windows 7, 64-разрядная версия):

enter image description here

Код, отображающий рассматриваемое изображение, следующий :

figure;
clf;
cla;
imshow(matrix, []);
colormap(cmap);
set(gca, 'Clim', [0 highest_index]);

где:

  • матрица имеет тип uint32 (хотя я также пробовал явно преобразовать матрицу как double перед вызовом imshow )
  • Значения в матрице находятся в диапазоне от 0 до 900
  • cmap имеет 901 записей
  • наибольший_индекс равен 900

Запись RGB для значения 259 в матрице составляет [1, 0, 0,1] как на изображении выше, так и в массиве цветовой карты cmap , то есть cmap (300, :) = [1, 0, 0,1] (обратите внимание, что значение матрицы 259 получает индекс 300 в цветовой карте, поскольку fi Первая запись цветовой карты предназначена для значения матрицы 0 ).

Вопросы:

Почему это происходит? Это ошибка? Что я делаю не так?

Обновление 1:

  1. Я попытался переключить CDataMapping на прямой или масштабированный , но это не помогло разница.
  2. Я также пробовал использовать imagesc вместо imshow , но это не имело значения.
  3. Если я сначала конвертирую изображение в RGB (т. Е. Преобразовываю проиндексированное изображение в изображение с истинным цветом ; см. Здесь для получения дополнительной информации), т.е. с i_rgb = ind2rgb (i_indexed, cmap) ошибка исчезает, и изображение отображается правильно .

    К сожалению, если я показываю изображение с истинным цветом , подсказка данных больше не показывает индекс в исходной матрице для каждого цвета, а вместо этого просто отображает вектор 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');

Результатом кода выше:

enter image description here

5
задан shoelzer 25 October 2012 в 15:22
поделиться