我有一个带有12位数据的N x M
- 矩阵的图像,我想使用imwrite
将图像保存为.pgm
文件。
为什么MATLAB将图像缩放到16位?我怎么能绕过这个呢?
使用'MaxValue'
参数似乎也会改变图像,因为它无法在之后正确显示,例如在IrfanView。
答案 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。