Python Scipy中的ndimage.gaussian_filter抛出运行时错误

3

我想要做的事情:

  1. 使用Python读取图片。
  2. 使用Scipy的ndimage.gaussian_filter()函数应用高斯滤波器。
  3. 显示滤波后的图像。

以下是我尝试运行的代码:

import cv2
from matplotlib import pyplot as plt
import scipy.ndimage as ndimage

img = cv2.imread('lena.png', 0)
img = ndimage.gaussian_filter(img, sigma=(5, 5, 0), order=0)
plt.imshow(img, cmap='gray', interpolation='bicubic')
plt.show()

问题是什么:

我遇到了以下错误:

RuntimeError: sequence argument must have length equal to input rank

完整的堆栈跟踪如下:
Traceback (most recent call last):
  File "/Users/guest/stackoverflow.py", line 6, in <module>
    img = ndimage.gaussian_filter(img, sigma=(5, 5, 0), order=0)
  File "/Users/guest/anaconda/envs/MyEnv/lib/python3.5/site-packages/scipy/ndimage/filters.py", line 346, in gaussian_filter
    sigmas = _ni_support._normalize_sequence(sigma, input.ndim)
  File "/Users/sguest/anaconda/envs/MyEnv/lib/python3.5/site-packages/scipy/ndimage/_ni_support.py", line 65, in _normalize_sequence
    raise RuntimeError(err)
RuntimeError: sequence argument must have length equal to input rank

这是我正在处理的图片: leng.png


2
我不熟悉这个函数,但从错误信息来看,我猜测可能是img是二维的,但你给了三个值,或者order也必须有三个值。 - Cris Luengo
1
@CrisLuengo的猜测是正确的。通过在第二个参数中放置0,您告诉imread将图像转换为灰度。因此,img是一个二维数组。 - Warren Weckesser
@CrisLuengo,你是正确的。将sigma更改为sigma =(5, 5)解决了它。您能否将其作为答案添加到此问题中? - Trevor Track
1个回答

4
根据堆栈跟踪,错误"sequence argument must have length equal to input rank"是由这行代码引发的:img = ndimage.gaussian_filter(img, sigma=(5, 5, 0), order=0) sigma 是一个序列参数,您需要为每个图像维度指定一个值(这就是错误消息中提到的“输入秩”)。
显然,语句img = cv2.imread('lena.png', 0)返回一个二维数组(0参数告诉imread将图像转换为灰度)。因此,gaussian_filter需要2个sigma值,而不是3个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接