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

时间:2014-12-15 15:46:14

标签: matlab image-processing png

我有一个带有12位数据的N x M - 矩阵的图像,我想使用imwrite将图像保存为.pgm文件。

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

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

1 个答案:

答案 0 :(得分: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}

因此,对于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)

请注意,您可以使用在[0,1]之间缩放的双精度值,根据上面代码注释中的表格。

对于阅读 12位PGM / PPM,请参阅here