Я заметил, что MATLAB иногда неправильно отображает мои цвета. Я не уверен, что это ошибка программирования на моей стороне или это настоящая ошибка в MATLAB. Я заметил такое поведение с некоторой регулярностью в течение последнего года или около того.
На этот раз я решил сделать снимок фигуры с рассматриваемой ошибкой (сделанный на MATLAB 2011b в Windows 7, 64-разрядная версия):
Код, отображающий рассматриваемое изображение, следующий :
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
).
Почему это происходит? Это ошибка? Что я делаю не так?
CDataMapping
на прямой
или масштабированный
, но это не помогло разница. imagesc
вместо imshow
, но это не имело значения. Если я сначала конвертирую изображение в RGB (т. Е. Преобразовываю проиндексированное изображение
в изображение с истинным цветом
; см. Здесь для получения дополнительной информации), т.е. с i_rgb = ind2rgb (i_indexed, cmap)
ошибка исчезает, и изображение отображается правильно .
К сожалению, если я показываю изображение с истинным цветом
, подсказка данных больше не показывает индекс в исходной матрице для каждого цвета, а вместо этого просто отображает вектор RGB (т.е. это логично, поскольку MATLAB больше не знает исходный индекс).
Вот пример кода:
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');
Результатом кода выше: