【问题标题】:QImage: is there any lazy copying crop methodQImage:有没有什么懒惰的复制裁剪方法
【发布时间】:2011-06-05 19:28:24
【问题描述】:

我试图使用 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 的类似操作太快了。两个主要操作是 copy() 和 operator==() 。我认为大部分时间都花在了 copy() 上,因为它只在那里执行复制。如果它只是一个惰性的写时复制操作,那么它会更快。

有什么方法可以更快?

【问题讨论】:

    标签: qt image-processing pyqt pyqt4 qimage


    【解决方案1】:

    较快的方法是手动比较像素 - 您正在做的副本是浪费。假设您要查找 backgroundMask 作为“图像”的子图像。你从左上角开始。现在您发现图像的像素 (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 图像之间的转换很简单并且有据可查。

    【讨论】:

    • 这是困扰我的问题。 Python 循环很慢并且没有优化。
    • 但是这个算法比你用过的算法要好得多,尽管你的那一部分被推到了 C++ 中。否则使用我建议的 PIL 方法。
    猜你喜欢
    • 2019-05-13
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多