我是否在MATLAB imfilter中发现了单精度输入的错误?

时间:2014-10-17 14:29:16

标签: matlab image-processing

a我在我的matlab代码中发现了奇怪的非确定性行为,我可以将其减少到以下最小代码片段:

   image = single(zeros(16,14));
   grad = imfilter(image, [0 0 0;0 1 0;0 0  0]);
   tcn = norm(grad(:));        
   fprintf('norm:  %f   \n', double(tcn));

首先,我执行"清除所有" ,然后运行代码段六次并获得以下输出

norm:  107570908894816200000000000000.000000  
norm: 0.0
norm: 0.0
norm: NaN
norm: 0.0
norm: 0.0
...

然后正确的输出继续。 我可以"重启"使用"清除所有"。

的错误行为

我在运行Windows 7的两台不同计算机上使用MATLAB 2014b和2013a对此进行了测试。

删除single()强制转换似乎可以解决问题。 此外,更改输入图像的大小可以解决某些值的问题。 我将使用double()强制转换来解决这个问题。

但是,我在这里遗漏了什么,或者这是imfilters单一实施的错误?

1 个答案:

答案 0 :(得分:2)

我将回答我自己的问题,因为它在Matlab中是一个真正的错误。

我联系了Mathworks支持,他们的开发人员确认了这个错误。建议进行以下工作:

我与开发人员交谈,结果是图像处理工具箱中的错误。

  1. 使用conv2:
  2.   
        

    out = conv2(image,grad,'same');

      

    如果使用零填充,则使用conv2(默认情况下为imfilter)。

    1. 使用双精度:
    2.   
          

      out = single(imfilter(double(image),grad));

        
      1. 关闭IPP:
      2.   
            

        iptsetpref( 'UseIPPL',假);

          

        请注意,这将禁用图像处理工具箱中的许多功能的性能优化,并应作为最后的手段使用。