Лучший способ использовать IMSHOW :
imshow(img,map)
Вот ваш слегка переписанный пример:
%# indexed image
I = spiral(40);
%# Synthesize a colormap first in HSV and then transform it to RGB
mx = max(I(:));
cmap = hsv2rgb([(0:mx-1)'./max(mx,1) ones(mx,2)]); %'
%# show image
imshow(I,cmap)
colorbar
datacursormode on
РЕДАКТИРОВАТЬ:
Благодаря @ ItamarKatz мы теперь знаем, что в Windows, если вы отображаете индексированное изображение с более чем 256 цветами, нельзя использовать «живописцы»Алгоритм рендеринга.
IMSHOW (который ниже вызывает функцию IMAGE нижнего уровня), обнаруживает такой случай и правильно обрабатывает его.
Если вы все еще хотите использовать IMAGE / IMAGESC, вы должнызнать о типе данных индексированного изображения:
- double : изображение содержит целые числа в диапазоне
[1 length(cmap)]
в качестве индексов в текущей цветовой карте - uint8 / uint16 : изображение содержит целые числа в диапазоне
[0 255]
для uint8
или [0 65535]
для uint16
, интерпретируемые как индексы в текущей цветовой карте.
, таким образом, существуетсмещение (диапазон начинается с 0
или 1
), с которым вам следует быть осторожным.
ВотПример выше, используя функцию IMAGE напрямую (один с двойным типом данных, другой с uint16):
%# indexed image and colormap
I = spiral(40);
cmap = hsv( max(I(:)) );
%# show indexed image (double)
hFig = figure(2);
hImg = image(I); %# one-based index into colormap
colormap(cmap), colorbar
axis off image
%# fix bug on Windows with indexed image of more than 256 colors
if ispc && strcmpi(get(hImg,'CDataMapping'),'direct') && size(cmap,1) > 256
set(hFig, 'Renderer','zbuffer') %# opengl renderer also works
end
%# show indexed image (uint16)
hFig = figure(3);
hImg = image( uint16(I-1) ); %# zero-based index into colormap
colormap(cmap), colorbar
axis off image
%# fix bug on Windows with indexed image of more than 256 colors
if ispc && strcmpi(get(hImg,'CDataMapping'),'direct') && size(cmap,1) > 256
set(hFig, 'Renderer','zbuffer')
end