35

opencv pythonバインディングであるcv2を使用して、画像にフィルターを適用しようとしています。私のコードは次のようになります。

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で発生しますが、medianBlurでは発生しません。何かご意見は?

4

2 に答える 2

34

cv2.blurの場合、(2,2)のように、ksizeを2つの要素のタプルとして指定する必要があります。ただし、me​​dianBlurの場合、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両方とも有効であるため、のようなものは有効ですが、の場合は次のような整数を使用する必要があります。intfloatdata[x,y]=1.04.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 に答える