当我image
在Matlab图形窗口中显示位图图像时,我遇到了奇怪的文物:
我所指的是十字形结构,这些结构在脑切片的边缘特别明显,但始终存在.
这些结构不在底层图像数据中,与此图像中的完全相同:
我假设工件与稍微重新缩放有关,这是将图像与给定轴尺寸匹配所必需的.
有人知道如何避免这些文物吗?我试图改变这个'Renderer'
确实会影响神器的数字,但不会让它消失.
如何重现效果:
将第二张图像另存为"image.png"
执行:
im = imread('image.png'); image(im) set(gca, 'Units', 'pixels') set(gca, 'Position', [76.1094204520027 576.387782501678 343.969568136048 357.502797046319])
最大化图形窗口,以便带有图像的轴变得可见
原生图像尺寸为306 x 318,但显示为约344 x 358像素.
我做了一些进一步的实验,发现效果不是特定于这个图像,特定的定位或色彩图:
[x, y] = meshgrid(-1:0.01:1); imagesc(cos(10*sqrt(x.^2 + y.^2)))
给
对于图形窗口的特定大小,显示相同类型的工件.
了解这些人工制品是否特定于我的Matlab版本(2013a)或平台(Debian Linux,内核3.14和NVidia图形)将会很有趣.
它看起来好像是神器是由Matlab 插值引起的,以将图像像素转换为屏幕像素.
能够在显示图像时更改Matlab使用的插值方法会很好,但这似乎不可能(更改'renderer'
没有帮助).因此,您可以手动内插图像以匹配显示大小,然后显示该插值图像,其中一个图像像素现在对应于一个屏幕像素.这样Matlab就不必进行插值.
为了进行插值,我使用了该imresize
函数.我发现所有可用的插值方法都给出了或多或少相同的结果,除了'box'
,这比Matlab的自动屏幕插值更糟糕.我附上一些结果:
第一张照片是通过您的方法获得的.您可以在其左右边缘和下方内对角线边缘看到伪影.码:
m = 344; n = 358; image(im) set(gca, 'units', 'pixels', 'Position', [40 40 m n])
第二张图片imresize
使用'box'
选项应用手动插值.工件类似,甚至更加明显.
imr = imresize(double(im)/255, [m n], 'box'); %// convert to double and %// interpolate to size [m, n] image(imr/max(imr(:))) %// display with image size matching display size. %// Normalization is required because the interpolation may give values %// out of the interval [0 1] set(gca, 'units', 'pixels', 'Position', [40 40 m n])
第三个数字是第二个数字,但有'bilinear'
选项.虽然在某些部分仍然可见,但是这些伪影非常衰减.其他插值方法给出类似的结果.