“为什么MATLABs会这样做?”;imwrite";缩放12位图像,如何避免这种情况?
我有一个12位数据的“为什么MATLABs会这样做?”;imwrite";缩放12位图像,如何避免这种情况?,matlab,image-processing,png,Matlab,Image Processing,Png,我有一个12位数据的nxm-矩阵图像,我想使用imwrite将图像保存为.pgm文件 为什么MATLAB将图像缩放到16位?我怎样才能避免这种情况 使用'MaxValue'参数似乎也会改变图像,因为它在之后无法正确显示,例如在IrfanView中。MaxValue参数有点违反直觉。它确实指定写入带有特定深度的最大值标记的PGM(例如,此处为12位),但它也告诉iwrite重新缩放数据。在writepnm>remap\u pixel\u值中进行重缩放: function newdata = rem
nxm
-矩阵图像,我想使用imwrite
将图像保存为.pgm
文件
为什么MATLAB将图像缩放到16位?我怎样才能避免这种情况
使用
'MaxValue'
参数似乎也会改变图像,因为它在之后无法正确显示,例如在IrfanView中。MaxValue
参数有点违反直觉。它确实指定写入带有特定深度的最大值标记的PGM(例如,此处为12位),但它也告诉iwrite
重新缩放数据。在writepnm>remap\u pixel\u值中进行重缩放:
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
data,它将通过位移位bitshift(data,-4)应用65535/maxval
的比例来重新缩放数据代码>。您不希望它重新缩放数据,但也希望它将文件写入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,请参阅。我已经写了我的答案,但这个问题与这个问题有什么不同:?这是关于imwrite
,而不是imread
imwrite
只支持8位、16位或32位图像的写入,这就是为什么它可能扩展到16位的原因。我认为使用12位图像没有问题强度并将其缩放到16位。会发生的是,一个12位的强度将被缩放到其16位的等效强度…所以从视觉上看,它们应该是相同的。实际强度本身显然是不同的。如果您提供更多的上下文来解释为什么需要保留12位,这可能会导致让我给你写一个答案。@rayryeng谢谢。我将12位图像读入matlab进行一些操作。然后我将操作后的图像传递给另一个(非matlab)使用系统
-命令进行编程,该命令需要保留12位值,否则其行为会有所不同。如果所有其他操作都失败,您可以编写自己的PGM输出函数。PGM格式非常简单。在8位无符号整数数组中构建文件,然后调用fwrite(fileID,A)
.Huh!…想想看……你必须做相反的事情。顺便说一句+1。太好了,谢谢!这肯定是一个令人惊讶的答案,至少对我来说是如此!