当我在Matlab图形窗口中使用image
显示位图图像时,我遇到了奇怪的文物:
我指的是十字形结构,这些结构在脑切片的边缘特别明显,但始终存在。
这些结构不在底层图像数据中,与此图像中的完全相同:
我认为这些工件与将图像与给定轴尺寸匹配所需的轻微重新缩放有关。
有人知道如何避免这些文物吗?我尝试更改图'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图形)将会很有趣。
答案 0 :(得分:6)
我觉得好像这些瑕疵是由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'
选项。虽然在某些部分仍然可见,但是这些伪影非常衰减。其他插值方法给出了类似的结果。
答案 1 :(得分:1)
正如已经提到的,MATLAB使用最近邻插值来进行上采样和下采样图像以供显示。由于图像窗口是用户可调整大小的,因此可以通过移动窗口来改变由此产生的伪像。
一种解决方案是为图像显示编写一个包装类,用于监视窗口事件并使用imresize
调整大小以更准确地将数据显示到屏幕。我写了这样一堂课,并且已公开发表。我一直在做图像处理工作,MATLAB的内置显示系统非常烦人。我用这个:
http://www.mathworks.com/matlabcentral/fileexchange/46051-rviewer
它旨在成为image
的替代品,并会对图片进行适当的重新取样。