Как восстановить предыдущую цветовую карту в Matlab?

У меня есть несколько изображений в некотором диапазоне чисел. Вот пример изображения:

лаплациан

Это уровень в лапласианской пирамиде изображения. (Не обязательно понимать, что такое пирамида Лапласа...)

Теперь мне нужно выполнить некоторые операции с этими изображениями, и для этого мне нужно изменить цветовую карту. Я изменил его на серый (256) и сделал нужные мне операции. Итак, теперь у меня есть разные изображения в colormap(gray(256)).

Теперь мне нужно вернуться к предыдущему диапазону. Но я не знаю предыдущий диапазон или цветовую карту. Я попытался сохранить цветовую карту перед операциями.

Я пробовал это:

imwrite(img,colormap(gray(256)),str);

но это изменило всю матрицу на 255.

Как правильно это сделать?


person Alaa M.    schedule 02.02.2015    source источник
comment
Установка палитры не должна влиять на изображения (т.е. значения в матрице). Меняется только то, как он отображается. Таким образом, реальный ответ зависит от того, хотите ли вы просто отображать изображения (т.е. с чем-то вроде imshow(I,[])) или хотите ли вы изменить масштаб значений в матрицах (т.е. чтобы imwrite работало правильно).   -  person nkjt    schedule 02.02.2015
comment
Я не упомянул, что использовал imwrite: imwrite(img,colormap(gray(256)),str); А потом перечитал картинки. Итак, матрицы изменились...   -  person Alaa M.    schedule 02.02.2015
comment
Ну, это гораздо более актуально, чем код, который вы ранее дали. (отредактировано)   -  person nkjt    schedule 02.02.2015


Ответы (1)


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
comment
После того, как я уменьшу масштаб, я выполню некоторые другие операции, чтобы результирующее изображение находилось в диапазоне [0..255]. И только потом я покажу изображения. Это проверено и работает. Так что не нужно беспокоиться о отображении изображений. Итак, вы предлагаете сохранить минимум и максимум, масштабировать img до [0..255] (может быть, mod(img,256)?), выполнить необходимые мне операции, а затем использовать минимум и максимум для восстановления предыдущего диапазона? - person Alaa M.; 02.02.2015
comment
Это зависит от того, что вы хотите делать с изображениями/результатами. Вы показываете значения с отрицательными числами с плавающей запятой - их нельзя сохранить/восстановить с помощью imwrite. (Однако не используйте mod — это уничтожит ваши данные!). Я лично стараюсь избегать такого масштабирования в случае, если мои значения имеют физический смысл, сохраняю эти значения в формате, который их сохраняет, и использую другие методы автоматического масштабирования при отображении (например, [] в imshow или imagesc). - person nkjt; 02.02.2015