图像过滤 - 结果错误?

时间:2014-05-14 14:31:01

标签: image-processing scipy filtering convolution

我正在尝试使用用户提供的蒙版卷积图像,在本例中为

u = array([[-2,-2,-2],[-2,25,-2],[-2,-2,-2]])/9

使用命令

In[1]:  import scipy.ndimage as ndi
In[2]:  import skimage.io as io 
In[3]:  c = io.imread('cameraman.png')
In[4]:  cu = ndi.convolve(c,u)
In[5]:  io.imshow(cu)

我正在对GNU Octave中的命令进行检查:

Octave-3.8: 1> c = imread('cameraman.png');
Octave-3.8: 2> u = [-2 -2 -2;-2 25 -2;-2 -2 -2]/9
Octave-3.8: 3> cu = imfilter(c,u)
Octave-3.8: 4> imshow(cu)

但事情就是这样:Octave似乎给出了正确的结果,但Python没有,即使命令convolveimfilter应该实现相同的算法。 (实际上imfilter执行相关,在这种情况下与卷积相同。)

Octave输出为:

enter image description here

并且Python输出是:

enter image description here

你可以看到

与Octave结果非常不同。有谁知道这里发生了什么?或者使用用户提供的线性滤波器比使用convolve

有更好的方法

1 个答案:

答案 0 :(得分:0)

问题可能是您的卷积使图像亮度值超出界限的结果。我在Matlab(〜= Octave)中运行了下面的示例,并且对于最初具有灰度值0-255的图像,因此在标准化范围[0,0.99]中,结果以范围[-0.88,2.03]中的像素结束。

>> img=double(imread('cameraman.tif'))./255;
>> K=[-2 -2 -2 ; -2 25 -2; -2 -2 -2]/9;
>> out=conv2(img,K,'same');
>> max(max(out))

ans =

    2.0288

>> min(min(out))

ans =

   -0.8776

可能是Python在使用超出范围灰度值<0或> 255的图像进行可视化时存在问题,这导致值的钳位导致这些区域中的黑/白晕。也许Octave在显示图像之前对图像进行标准化,从而导致很少的伪影。如果你在显示它之前用Python规范化你的图像,你还有这个问题吗?