2013-11-02 3 views
2

У меня есть набор значений между 0 и 1. После того, как я установил эти значения между 0 и 255, я хочу сохранить их как изображение в градациях серого в формате pgm. Проблема заключается в том, что после того, как я сохранить его как изображение значения я получаю, когда я прочитал изображение отличается от предыдущей матрицы со значениями от 0 до 255.Matlab сохраняет матрицу как изображение с разными значениями

Вот простой пример:

>> a=[0.5,1,0.3]   

a = 

0.5000 1.0000 0.3000 


>> b=single(floor(255 * a)) 

%these are the values I want in the image 
b = 

127 255 76 

imwrite(b, 'test.pgm'); 

% i don't want these values!!! 
c=imread('test.pgm')  

c = 

255 255 255 

Что происходит? почему Matlab не сохраняет мои ценности? это проблема конверсии?

ответ

2

, что происходит? почему Matlab не сохраняет мои ценности? это проблема с разрешением ?

Да, это проблема конвертации и не нужна. MatLab автоматически конвертирует вас.

Следовательно, попробуйте хранить a вместо b

imwrite(a, 'test.pgm'); 

Цитируя документации imwrite

imwrite(A,filename) 

Если A представляет собой полутоновое или RGB цветное изображение типа данных двойной или грех гле, затем imwrite предполагает, что динамический диапазон [0,1] и автоматически масштабирует данные от 255 перед записью его в файл, как 8-битовые значения


EDIT

Если вы хотите придерживаться ручного преобразования, вам нужно набрать актеров, как uint8

b = uint8(floor(255 * a)) 
+0

Благодарим вас за эту информацию. Я знал это, но когда я сохраняю значения, масштабированные в [0,255] в файле, умножая значения на 255 и сравнивая их с масштабированием matlab, есть несколько различий в значениях. Это происходит потому, что я использую floor() для сохранения значений, а Matlab использует ceil(). И тебе спасибо! – mad

+1

@mad Гош! Это ваш вызов. Обновлено с помощью редактирования. – jkshah

1

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

Попробуйте b = uint16(floor(255 * a))

+0

Спасибо, это очень помогает! – mad