我正在尝试使用用户提供的蒙版卷积图像,在本例中为
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
执行相关,在这种情况下与卷积相同。)
Octave输出为:
!
并且Python输出是:
!
你可以看到与Octave结果非常不同。有谁知道这里发生了什么?或者使用用户提供的线性滤波器比使用convolve
?
答案 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规范化你的图像,你还有这个问题吗?