Image processing 图像过滤-错误的结果?

Image processing 图像过滤-错误的结果?,image-processing,scipy,filtering,convolution,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八度

在本例中,我正在尝试使用用户提供的掩码卷积图像

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-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的输出是:

!


正如你所看到的,这和倍频程的结果非常不同。有人知道这里发生了什么吗?或者,使用用户提供的线性滤波器进行卷积比使用卷积更好吗?

问题可能是卷积导致图像亮度值超出范围。我在Matlab~=倍频程中运行了下面的示例,对于初始灰度值为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在可视化灰度值超出255范围的图像时遇到问题,这会导致值被钳制,从而导致这些区域出现黑/白光晕。也许倍频程在显示图像之前会使图像正常化,从而产生少量瑕疵。如果在显示图像之前用Python对其进行标准化,是否仍然存在此问题?

Python 2或Python 3?在Python2中,u=array[[-2,-2,-2],-2,25,-2],-2,-2]]/9使用整数除法。将9更改为9.0,或从文件顶部的_ufuture _uu导入分部添加。感谢您的回复!-但事实上,我使用的数组的定义方式是浮点型的——为了便于解释,我在上面就是这样描述的。即使按照您的建议使用9.0也不会改变输出。我正在使用Python2.7。在调用ndi.convalve之前,尝试将图像转换为浮点;e、 g.cu=ndi.convolvec.astypefloat,u。我得到了一些不同的结果,但是它看起来和你的倍频程输出不一样。有一件事似乎是可行的:按照你说的,用float类型的图像进行卷积,然后用imshowcu/255,cmap=cm.gray,vmax=1.0,vmin-0.0设置vmax和vmin来显示结果。是的,我也想到了这一点。我已经尝试过先将图像转换为float32进行卷积,在这种情况下,max和min分别为517.3333和-223.7778,它们只是您的值乘以255。转换为uint8以使用cu2=uint8255*cu-cu.min/cu.max-cu.min进行显示会导致非常褪色的图像,亮度范围较低。我刚刚将我的库numpy、scipy和scikit映像升级到它们的最新版本,这个问题仍然存在。