Эта обработка изображений может кодировать быть оптимизированной для использования меньшей памяти?

У меня есть функция Python, которая берет строковое s-выражение как" (добавьте (sub 10 5) 5)", где "добавляют", и "sub" являются на самом деле функциями обработки изображений, и оценивает и создает изображение, представленное в строке. Функции обработки изображений берут константы, переменные или другие изображения (представленный как списки векторов), и изображения возврата представили тот же путь. PIL используется для преобразования изображения, представленного как список векторов в файл изображения.

Для оценки s-выражений префиксной нотации я преобразовываю s-expr в список, инвертирую его и выполняю итерации маркеров, пока функция не найдена, в которой точке выполняется функция обработки изображений, и получающееся изображение заменяет функцию и ее аргументы в списке. Это сделано, пока только один элемент не оставляют в списке, который является заключительным изображением.

Функции обработки изображений просты - большинство выполняет некоторую математическую операцию к каждому из (r, g, b) значения в изображении (изображениях).

Проблемой является мой компьютер, заходит в тупик, если я хочу сделать достойные размерные изображения для более сложных выражений. Это может быть оптимизировано для использования меньшей памяти?

def createImage(self, sexpr, filename, (picWidth, picHeight)):
    """Use the image processing functions in ImgProcessing
       to create an image from the procedural information
       contained in the s-expression."""

    img = Image.new("RGB",(picWidth,picHeight),(255,255,255))
    ip = ImgProcessing(picWidth,picHeight)

    # Split s-expression into list of tokens and reverse
    sList = sexpr.replace("(","").replace(")","").split()
    sList.reverse()

    while len(sList) > 1:

        for index,token in enumerate(sList):
            # If token is an image processing function
            if type(token) == str and self.FuncSet.has_key(token):
                # If this function takes one argument
                if self.FuncSet[token] == 1:
                    rawImage = eval("ip." + token + "(" + "\"" + str(sList[index-1]) +
                                    "\"" + ")")
                    sList = sList[:index-1] + [rawImage] + sList[index+1:]
                    break
                # If this function takes two arguments
                elif self.FuncSet[token] == 2:
                    rawImage = eval("ip." + token + "(" + "\"" + str(sList[index-1]) +
                                    "\"" + "," + "\"" + str(sList[index-2]) + "\"" +
                                    ")")
                    sList = sList[:index-2] + [rawImage] + sList[index+1:]
                    break

    img.putdata(sList[0])
    img.save(filename)
1
задан Johnny 26 July 2010 в 23:45
поделиться

2 ответа

Профилирование может сказать вам, где программа проводит большую часть своего времени.

Во-вторых, str (sList [index-1]) преобразовывает изображение в строку? ip.token (...) возвращает изображение? Если это так, вы несколько раз выполняете преобразование между строкой и изображением. Это может быть очень медленно.

Это может помочь изменить

rawImage = eval("ip." + token + "(" + "\"" + str(sList[index-1]) +
                                    "\"" + ")")

на что-то вроде

getattr(ip,token)(sList[index-1])

, но, конечно, это зависит от того, какой тип аргумента ожидает ip.token . Я не смог найти никакой информации о ImgProcessing в Google. Это кастомный класс? Если да, возможно, стоит подробнее объяснить, как это работает. Если ip.token можно изменить с приема строк на получение изображений, это может стать большим улучшением.

2
ответ дан 2 September 2019 в 22:43
поделиться

По моему опыту, все, что вы делаете на чистом Python или PIL попиксельно на большом изображении, в январе будет медленным, как меласса. Подумайте о переносе низкоуровневого материала в расширение Python, написанное на C. Я использовал OpenCV, но это требует некоторого обучения.

0
ответ дан 2 September 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: