35

我只是想使用 cv2(opencv python 绑定)对图像应用过滤器。这是我的代码的样子:

im = cv2.imread('./test_imgs/zzzyj.jpg')
cv2.imshow('Image', cv2.blur(im, 2)
cv2.waitKey(0)

它几乎是从文档中复制和粘贴的。但是,它只是不起作用,没有比此消息更多的痕迹:

SystemError: new style getargs format but argument is not a tuple

GaussianBlur 会出现同样的错误,但中值模糊不会出现这种错误。有什么想法吗?

4

2 回答 2

34

对于 cv2.blur,您需要将 ksize 作为两个元素的元组,例如 (2,2)。但是对于 medianBlur,ksize = 3 就足够了。它将从中减去一个平方内核。

所以制作这样的代码:

im = cv2.imread('./test_imgs/zzzyj.jpg')
cv2.imshow('Image', cv2.blur(im, (3,3)))
cv2.waitKey(0)
cv2.destroyAllWindows()

希望它会工作!

于 2012-11-05T06:20:13.363 回答
16

Pillow从升级2.8.14.1.0.

这是一段示例代码,它将在运行时生成异常Pillow==4.1.0

from PIL import Image
img = Image.new('RGBA', [100,100])
# An empty mask is created to later overlay the original image (img)
mask = Image.new('L', img.size, 255)
# Get transparency (mask) layer pixels, they will be changed!
data = mask.load()
# The function used later
def foo(x,y): return round(1.0*x/(y+1))
# Update all pixels in the mask according to some function (foo)
for x in range(img.size[0]):
    for y in range(img.size[1]):
        data[x,y] = foo(x,y)

输出:

Traceback (most recent call last):
  File "x.py", line 12, in <module>
    data[x,y] = foo(x,y)
SystemError: new style getargs format but argument is not a tuple

这里的实际错误与异常中说明的内容无关。实际上,分配给数据的数据类型是错误的。在2.8.1两者中intfloat都是有效的,所以像这样的东西data[x,y]=1.0是有效的,而在4.1.0需要使用像这样的整数:

data[x,y]=1
data[x,y]=int(1.0)

因此,在上面的示例中,foo可以将其重新定义为以下内容,以便在2.8.14.1.0. 中工作:

def foo(x,y): return int(round(1.0*x/(y+1)))
于 2017-04-27T11:35:50.927 回答