【问题标题】:Strange/Magical Image visualization with Matlab使用 Matlab 进行奇怪/神奇的图像可视化
【发布时间】:2013-01-13 18:25:14
【问题描述】:

我有一个 double 的图像,我想用 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\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中的图和保存的文件

【问题讨论】:

  • 我无法在 R2013a 上使用 I = repmat(linspace(0,1,512),512,1); I = I+randn(size(I))*0.1; I16 = im2uint16(I); imwrite(I16,'test.png','BitDepth',16) 重现此问题,并在 IrfanView 或 Photoshop CS4 中打开
  • 我也无法在 R2012b 上重现它。
  • 可以和我们分享一下原始数据吗?
  • 只是为了确保,当您使用imshow 时,您使用的是默认的 matlab 颜色图(64 色)还是 photoshop 使用的颜色图(256 色)...
  • @leonbloy 在我手中,它看起来很不错。

标签: image matlab image-processing png


【解决方案1】:

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

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

更新:另见here

【讨论】:

  • 我得出了同样的结论,但你解释得更好 - +1。
  • @leonbloy:我已经在问题中发布了用于测试的图像和脚本
  • @llnk : 你试过我在上一段中所说的吗?
  • @leonbloy:如果我从 photoshop 或 Windows Viewer 放大,我会看到更多噪点,但我认为这是正常的(放大 = 更多噪点)
  • 无论如何我可以强制matlab在下采样时使用双线性插值吗?
【解决方案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 x 500 像素)时,它在 Matlab 和其他图形程序中的显示相同。所以我敢打赌,Matlab 与其他程序的不同之处在于重新采样你的图像。正如@leonbloy 建议的那样,Matlab 可能会进行最近邻重采样,而其他程序会进行插值。

【讨论】:

  • 谢谢+1。如果您查看整个图像(不查看右上角),您是否确认您看到很多噪点,而如果您编写并使用软件打开它,您看不到它?
  • @llnk:当我在 Matlab 中编写和打开时,我看不出有什么不同。当我使用其他软件打开并且放大时,噪音似乎较小。
  • 正是我在问题中看到的
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多