2

我有一组介于 0 和 1 之间的值。将这些值放在 0 和 255 之间后,我想将它们保存为 pgm 格式的灰度图像。问题在于,在我将其保存为图像后,我在读取图像时得到的值与之前的矩阵不同,其值在 0 到 255 之间。

这是一个简单的例子:

>> a=[0.5,1,0.3]           

a =

0.5000    1.0000    0.3000


>> b=single(floor(255 * a))

%these are the values I want in the image
b =

127   255    76

imwrite(b, 'test.pgm'); 

% i don't want these values!!!
c=imread('test.pgm')    

c =

255  255  255

发生了什么?为什么 matlab 不保存我的值?这是转换问题吗?

4

2 回答 2

2

发生了什么?为什么 matlab 不保存我的值?这是转换问题吗?

是的,这是转换问题,不需要。MatLab 会自动为您进行转换。

因此,尝试存储a而不是b

imwrite(a, 'test.pgm'); 

从文档中引用imwrite

imwrite(A,filename)

如果 A 是数据类型为doublesingle的灰度或 RGB 彩色图像,则 imwrite 假定动态范围为 [0,1] 并在将数据作为 8 位值写入文件之前自动将数据缩放 255


编辑

如果你想坚持手动转换,你需要输入 cast asuint8

b = uint8(floor(255 * a))
于 2013-11-02T17:18:34.820 回答
1

我认为你写的值应该是整数。

尝试b = uint16(floor(255 * a))

于 2013-11-02T17:13:42.947 回答