Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何避免Matlab中的图像显示伪影?_Image_Matlab_Graphics_Matlab Figure - Fatal编程技术网

Image 如何避免Matlab中的图像显示伪影?

Image 如何避免Matlab中的图像显示伪影?,image,matlab,graphics,matlab-figure,Image,Matlab,Graphics,Matlab Figure,当我在Matlab图形窗口中使用image显示位图图像时,我遇到了奇怪的伪影: 我指的是十字形结构,它在大脑切片的边缘特别明显,但贯穿始终 这些结构不在基础图像数据中,它们与此图像中的结构完全相同: 我假设这些伪影与轻微的重新缩放有关,这是将图像匹配到给定轴大小所必需的 有人知道如何避免这些人工制品吗?我尝试更改图形“渲染器”,这确实会影响工件,但不会让它消失 如何重现效果: 将第二幅图像另存为“image.png” 执行: im = imread('image.png'); image(

当我在Matlab图形窗口中使用
image
显示位图图像时,我遇到了奇怪的伪影:

我指的是十字形结构,它在大脑切片的边缘特别明显,但贯穿始终

这些结构不在基础图像数据中,它们与此图像中的结构完全相同:

我假设这些伪影与轻微的重新缩放有关,这是将图像匹配到给定轴大小所必需的

有人知道如何避免这些人工制品吗?我尝试更改图形“渲染器”,这确实会影响工件,但不会让它消失


如何重现效果:

  • 将第二幅图像另存为“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 graphics)的,这很有趣。

    在我看来,伪影似乎是由Matlab插值造成的,以将图片像素转换为屏幕像素

    如果能够在显示图像时更改Matlab使用的插值方法会很好,但这似乎是不可能的(更改
    “渲染器”
    没有帮助)。因此,您可以手动插值图像以匹配显示大小,然后显示该插值图像,其中一个图像像素现在对应于一个屏幕像素。这样Matlab就不需要插值

    为了做插值,我使用了这个函数。我发现所有可用的插值方法都给出了或多或少相同的结果,除了
    'box'
    ,这比Matlab的自动屏幕插值更糟糕。我附上一些结果:

    • 第一张图片是通过你的方法获得的。您可以在其左、右边缘以及较低的内部对角线边缘中看到瑕疵。代码:

      m = 344;
      n = 358;
      image(im)
      set(gca, 'units', 'pixels', 'Position', [40 40 m n])
      
    • 第二张图片使用
      'box'
      选项,使用
      imresize
      进行手动插值。这些伪影是相似的,甚至更明显

      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])
      
    • 第三个数字与第二个数字相同,但带有
      “双线性”
      选项。伪影非常衰减,尽管在某些部位仍然可见。其他插值方法给出了类似的结果


    如前所述,MATLAB对上采样和下采样图像使用最近邻插值进行显示。由于图像窗口是可由用户调整大小的,因此,只需移动窗口即可更改由此产生的瑕疵

    一种解决方案是为图像显示编写一个包装类,该类使用
    imresize
    监视窗口事件并调整大小,以便更准确地将数据显示到屏幕上。我写了这样一个类,它是公开的。我一直在做图像处理工作,而MATLAB内置的显示系统非常令人恼火。我用这个:


    它的设计目的是作为图像的替代品,并将正确地对图像进行重新采样。

    这非常奇特。我使用
    imshow
    显示了相同的图像,并且没有显示任何边缘瑕疵。我会看一看,然后再打给你。谢谢!我猜只有当图像显示的尺寸略大于其原始尺寸时才会发生这种情况。也可以想象,这是一种依赖于平台的效果:我在Debian Linux(内核3.14)上使用NVidia graphics。@rayryeng,我添加了在我的系统上重现这种效果的指令。太棒了。让我看看。大脑底部两个叶之间的交叉确实很奇怪。你说得对。这些伪影是因为它试图调整图像大小并将其放入图形中。我想看看是否有办法保持原始大小。你好,路易斯,是的,我担心会出现这种情况,但我希望有办法改变内置插值算法。我现在相信Matlab使用最近邻插值来显示图像(速度很快,但sh…),我很惊讶a)似乎没有办法改变这一点,b)我以前从未注意到这些伪影。我使用默认插值方法(即“双三次”计时
    imresize
    )并且发现,对于我的图像大小和因子,每次调用大约需要3毫秒,因此集成到我正在开发的GUI程序中应该是切实可行的。我现在不会接受你的答案,希望其他人有其他建议,但我很确定这是最终的答案。谢谢大家!@我完全同意。让我们拭目以待,看看是否有人能想出更好的办法。Matlab应该能够以更好的方式处理此问题,而不是强迫您手动执行插值