为什么MATLABs"imwrite"缩放12位图像以及如何规避这个?

jol*_*olo 4 matlab png image-processing

我有一个图像作为一个N x M矩阵与12位数据,我想用来imwrite将图像保存为.pgm文件.

为什么MATLAB将图像缩放到16位?我怎么能绕过这个呢?

使用该'MaxValue'参数似乎也会改变图像,因为之后无法正确显示,例如在IrfanView中.

cha*_*pjc 6

MaxValue参数有点直观.它确实指定写入标记有特定深度的最大值的PGM(例如,此处为12位),但它也告知iwwrite重新缩放数据.重新缩放发生在writepnm>remap_pixel_values:

function newdata = remap_pixel_values(data, maxval)
%REMAP_PIXEL_VALUES Remap pixel values in array of pixel values.
%
%   NEWDATA = REMAP_PIXEL_VALUES(DATA, MAXVAL) remaps the pixel values in
%   DATA as follows
%
%   Class of DATA   Input                    Output
%   -------------   -----                    ------
%   uint8           The set {0,1,...,255}    The set {0,1,...,maxval}
%   uint16          The set {0,1,...,65535}  The set {0,1,...,maxval}
%   double          The interval [0,1]       The set {0,1,...,maxval}
Run Code Online (Sandbox Code Playgroud)

因此,对于uint16数据,它将通过应用65535/maxval比特移位的比例来重新调整数据bitshift(data,-4);.您不希望它重新缩放数据,但您还希望它将文件写为12位(这种情况发生在writepnm>write_raw_data.解决方法是在调用之前应用相反的比例imwrite:

Iscaled = uint16(double(I)*(2^16-1)/(2^12-1))
imwrite(Iscaled,'test.pgm','MaxValue',2^12-1)
Run Code Online (Sandbox Code Playgroud)

请注意,根据上面代码注释中的表,您也可以使用在[0,1]之间缩放的double值.

有关读取 12位PGM/PPM的信息,请参见此处.