imwrite(img,colormap(gray(256)),str);
colormap
задает только цвет figure
, поэтому в imwrite
он вам не нужен. На самом деле, это не делает здесь ничего ценного. Если вы передадите карту gray(256)
, она запишет это как проиндексированное изображение. То есть он сохраняет в файле как значения пикселей, так и карту, которая говорит, что означают эти значения.
Однако он не масштабирует входное изображение, чтобы точно соответствовать палитре. Как указано в документах:
Если A является индексированным изображением типа данных double или single, то imwrite преобразует индексы в индексы с отсчетом от нуля, вычитая 1 из каждого элемента, а затем записывает данные как uint8. Если данные в A одинарные, преобразуйте A в double перед записью в файл GIF или TIFF.
Это означает, что если ваш img
содержит все значения 256 или выше, imwrite
вычтет единицу и запишет как uint8
, отсекая значения от 255 до 255 (и ниже 0 до 0). Таким образом, ваше изображение отображается как все 255.
Вам нужно сначала масштабировать img
до соответствующего диапазона (например, записать максимальное и минимальное значения вашей входной матрицы, а не colormap
! - прежде чем что-либо с ней делать). Это просто математика - например. что-то вроде img = img/256
может быть всем, что вам нужно. В большинстве случаев нет необходимости сохранять его с картой — вы просто записываете свои значения в оттенках серого, вы можете сохранить их с помощью imwrite
в обычное изображение.
imwrite
обычно ожидает, что double
находится в диапазоне от 0 до 1, а uint8
— в диапазоне от 0 до 255. Если ваши значения не совпадают с этим, вы получите обрезанные/пустые изображения и т. д.
Однако, поскольку значения хранятся как целые числа (uint8
) в большинстве форматов изображений, я не понимаю, как вы можете использовать imwrite
для сохранения значений, отображаемых в вашем примере, без потери точности. Вы также не сможете сохранить отрицательные значения. Поэтому было бы лучше сохранить ваши реальные значения в другом формате (файл *.mat
, csv и т. д.) и сохранить изображение, если оно вам нужно для визуализации, а не для хранения вычисленных значений.
person
nkjt
schedule
02.02.2015
imshow(I,[])
) или хотите ли вы изменить масштаб значений в матрицах (т.е. чтобыimwrite
работало правильно). - person nkjt   schedule 02.02.2015imwrite
:imwrite(img,colormap(gray(256)),str);
А потом перечитал картинки. Итак, матрицы изменились... - person Alaa M.   schedule 02.02.2015