使用Matlab进行奇怪/神奇的图像可视化

时间:2013-01-30 02:06:32

标签: image matlab image-processing png

我有一个double的图像,我想用无符号整数16位显示它,所以我这样做:

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

这显示了这一点(带有正常噪音):

现在我想用.png和Bit Depth 16 Bit写这个图像。我这样做:

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

现在用Photoshop CS5或Windows Photo Viwer打开的图像如下所示:(噪音神奇地消失了):

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

如何重现此错误

C:\test\ image I used here下载

现在运行此脚本:

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中的数字与保存的文件

2 个答案:

答案 0 :(得分:2)

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

要测试此功能,请尝试使用小图像。或者尝试缩放看似干净的图像,以实际尺寸查看(100%:一个图像像素=一个显示像素)

更新:另请参阅here

答案 1 :(得分: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可能正在进行最近邻重采样,而其他程序则会进行插值。