Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“为什么MATLABs会这样做?”;imwrite";缩放12位图像,如何避免这种情况?_Matlab_Image Processing_Png - Fatal编程技术网

“为什么MATLABs会这样做?”;imwrite";缩放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

我有一个12位数据的
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。太好了,谢谢!这肯定是一个令人惊讶的答案,至少对我来说是如此!