2014-11-28 2 views
3

У меня есть 12-битное pgm-изображение, которое я читаю с помощью imread. Результатом является 16-разрядное изображение, имеющее значения во всем диапазоне от 0 до 2^16 - 1.Как сканировать 12-разрядные изображения?

Какова шкала Matlab? Будет ли

X = imread('filename'); 
X = uint16(double(X)*((2^12-1)/(2^16-1))); 

Восстановите первоначальную интенсивность?

ответ

5

MATLAB правильно загружает 12-битные изображения PGM. Однако после того, как MATLAB загружает изображения, значения изображения масштабируются с 12-бит до 16 бит.

MATLAB использует следующий алгоритм для масштабирования значений от 12 бит до 16 бит:

% W contains the the 12-bit data loaded from file. Data is stored in 16-bit unsigned integer 
% First 4 bits are 0. Consider 12-bit pixel color value of ABC 
% Then W = 0ABC 
X = bitshift(W,4); % X = ABC0 
Y = bitshift(W,-8); %Y = 000A 
Z = bitor(X,Y); %Z = ABCA 
% Z is the variable that is returned by IMREAD. 

Обход этого заключается в том, как этот

function out_image = imreadPGM12(filename) 
out_image = imread(filename); 
out_image = floor(out_image./16); 
return 

В качестве альтернативы выполнить 4 битовый сдвиг к право:

function out_image = imreadPGM12(filename) 
out_image = imread(filename); 
out_image = bitshift(out_image,-4); 
return 

Дополнительную информацию можно найти здесь: http://www.mathworks.com/matlabcentral/answers/93578-why-are-12-bit-pgm-images-scaled-up-to-16-bit-value-representation-in-image-processing-toolbox-7-10

+1

Ответы только для ссылок должны содержать по крайней мере релевантную информацию, чтобы, если связь была нарушена, ответ остается в силе. Можете ли вы завершить то, что говорит ссылка? Спасибо –

+4

@ Benoit_11 сделано! –

+0

отличная работа! –