3

我有一个双倍的图像,我想用 unsigned int 16 位显示它,所以我这样做:

I = im2uint16(I);
figure;imshow(I);title('Image being saved')

这表明了这一点(带有正常的噪音):

现在我想用位深度为 16 位的 .png 来写这个图像。我愿意:

imwrite(I,'image.png','BitDepth',16);

现在用 Photoshop CS5 或 Windows Photo Viwer 打开的图像看起来像这样:(噪音神奇地消失了):

有人可以解释这种奇怪的行为吗?

如何重现此错误

C:\test\在我在这里使用的图像中下载:

现在运行这个脚本:

I = im2double(imread('C:\test\test_matlab.tif'));

% Add gaussian noise with variance = 0.0012
I = imnoise(I,'gaussian',0,0.0012);
figure,imshow(I);

imwrite(I,'C:\test\withNoise.tif');

并将matlab中的数字与保存的文件进行比较

4

2 回答 2

2

很难说,因为你没有提供足够的数据来重现,但我猜这个问题与显示问题有关:图像比你的物理显示窗口大,因此必须应用一些下采样来显示它。根据重新采样的完成方式,在这种情况下,结果可能会在视觉上非常不同。假设 matlab 对其显示应用最近邻重采样,这可以解释为什么图像看起来很嘈杂;相反,如果另一个图像查看器应用双线性插值或类似的东西,那将相当于一个实际上过滤掉白噪声的局部平均值。

要对此进行测试,请尝试使用小图像进行相同操作。或者尝试缩放明显干净的图像,以实际尺寸查看它(100%:一个图像像素 = 一个显示像素)

更新:另见这里

于 2013-01-30T13:20:49.177 回答
2

这是我所做的:

%# read the image (why is it so big?)
I = im2double(imread('https://p7o1zg.bay.livefilestore.com/y1pcQVsmssygbS4BLW24_X1E09BKt_Im-2yAxXBqWesC47gpv5bdFZf962T4it1roSaJkz5ChLBS0cxzQe6JfjDNrF7x-Cc12x8/test_matlab.tif?psid=1'));

%# add noise
I = imnoise(I,'gaussian',0,0.0012);

%# write tiff
imwrite(I,'withNoise.tif');

%# read the tiff again
I2 = imread('withNoise.tif');

class(I2) %# -- oopsie, it's uint8 now! 

%# convert to uint16 as in original post
I = im2uint16(I);

%# writ again
imwrite(I,'withNoise16.png','bitDepth',16);

%# read it
I2 = imread('withNoise16.png');

%# compare
all(all(I==I2)) %# everything is equal

因此,在写入/读取图像时不会发生任何奇怪的事情(尽管您在位转换中丢失了一些信息 - 您的原始图像只占用了大约三分之一的动态范围,所以如果您拉伸,您将丢失更多信息转换前的对比度)。

但是,图像是 2k×2k。当我只看图像的右上角(500×500 像素)时,它在 Matlab 和其他图形程序中的显示方式相同。因此,我敢打赌,Matlab 与其他程序的不同之处在于重新采样您的图像。正如@leonbloy 建议的那样,Matlab 可能会进行最近邻重采样,而其他程序会进行插值。

于 2013-01-30T13:22:57.530 回答