【发布时间】:2014-07-02 16:23:59
【问题描述】:
我正在尝试将图像与用户提供的蒙版进行卷积,在这种情况下
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 没有,即使命令 convolve 和 imfilter 应该实现相同的算法。 (实际上imfilter 执行了相关性,在这种情况下与卷积相同。)
八度输出是:
!
Python 输出为:
!
如您所见,这与 Octave 结果非常不同。有人知道这里发生了什么吗?或者有没有比使用convolve 更好的方式与用户提供的线性滤波器进行卷积?
【问题讨论】:
-
Python 2 还是 Python 3?在 Python 2 中,
u = array([[-2,-2,-2],[-2,25,-2],[-2,-2,-2]])/9使用整数除法。将9更改为9.0,或在文件顶部添加from __future__ import division。 -
感谢您的回复! - 但实际上我实际上是在使用以具有浮点类型的方式定义的数组 - 为了便于解释,我只是在上面这样描述它。即使按照您的建议放置 9.0 也不会改变输出。 (我使用的是 Python 2.7)。
-
在调用
ndi.convolve之前尝试将图像转换为浮点数;例如cu = ndi.convolve(c.astype(float),u)。我得到了一些不同的东西,但它看起来和你的八度输出不一样。 -
似乎可行的一件事:与 float 类型的图像进行卷积(如您所说),然后使用
imshow(cu/255,cmap=cm.gray,vmax=1.0,vmin-0.0)显示结果设置vmax和vmin似乎可以解决问题.
标签: image-processing scipy filtering convolution