2

QImage を使用して画像をロードし、画像全体を移動するテンプレート サブ画像との同等性をチェックしようとしていました。コードは次のとおりです。

for i in range(image.height() - backgroundMask.height() + 1):
        for j in range(image.width() - backgroundMask.width() + 1):
            subsection = image.copy(j, i, j + backgroundMask.width() - 1, i + backgroundMask.height() - 1)
            if subsection == backgroundMask:
                print 'equality action here'
            else:
                print 'non-equality action here'

問題は、これを行うのに時間がかかりすぎることです。Python Imaging Library を使用した同様の操作は速すぎました。2 つの主要な操作は copy() と operator==() です。そこでのみコピーを実行するため、copy() に多くの時間が費やされていると思います。レイジーなコピー オン ライト操作だったら、もっと高速だったでしょう。

より速くする方法はありますか?

4

1 に答える 1

0

手っ取り早い方法は、ピクセルを手で比較することです。コピーは無駄です。'image' のサブイメージとして backgroundMask を見つけたいとします。左上隅から始めます。image のピクセル (0, 0) が backgroundMask の (0, 0) と一致しないことがわかります。手動でピクセルを比較している場合は、画像の (0, 1) に進み、それを (0, 0) と比較します。しかし、あなたの場合、すでに幅 x 高さのピクセルをコピーするのに何年も無駄にしています。

start = time.time()
for i in xrange(image.height() - backgroundMask.height() + 1):
    for j in xrange(image.width() - backgroundMask.width() + 1):
        success = True
        for y in xrange(backgroundMask.height()):
            for x in xrange(backgroundMask.width()):
                if image.pixel(j + x, i + y) != backgroundMask.pixel(x, y):
                    success = False
                    break
            if not success:
                break

        if success:
            print 'match'
        else:
            print 'no match'

確かに、Python ではピクセル単位のアクセスが遅く、等値演算子は C で記述されています。それでも、投稿したものよりもかなり高速です。私が試した画像では、あなたのコードは 27 秒、私のコードは 0.8 秒かかりました。

ただし、この機能がそこに実装されている場合、最善の解決策はおそらく QImage を PIL イメージに変換することです。QImages と PIL 画像間の変換は簡単で、十分に文書化されています。

于 2011-06-05T10:33:16.847 に答える