4

imread で読み取った 12 ビットの pgm イメージがあります。結果は、0 ~ 2^16 - 1 の全範囲の値を持つ 16 ビット イメージです。

Matlab はどのようにスケーリングしますか? 意思

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

元の強度を回復しますか?

4

1 に答える 1

5

MATLAB は PGM 12 ビット イメージを正しくロードします。ただし、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を参照してください。 -画像処理ツールボックス-7-10

于 2014-11-28T10:56:54.617 に答える