Написание матричных преобразований со схемой для GIMP - PullRequest
1 голос
/ 27 апреля 2011

Я хочу написать хорошую математику с DrRacket (R5RS, но не только) (Racket Tag немного пуст).

Я бы очень хотел закодировать некоторые элементы матрицы, такие как:

(3 3 3) (5 3 4) (4 4 4) -> (5 3 4) (5 5 5) (5 3 4)

и другие подобные вещи, чтобы настроить некоторые хорошие фильтры GIMP...

Некоторые люди отметили, что это можно сделать с помощью списков внутри списков, но я не могу придумать практического примера здесь ...

Я с нетерпением жду вашего ответа,С уважением, Андреас_П

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

Несколько заметок:

1) что вы имеете в виду, когда Схема "встроена в ядро"? GIMP теперь имеет собственный Python-fu вместе со Script-fu

2) Лисп, выигравший Google AI Challenge, - Common Lisp, а не Схема

3) Я не уверен, но консоль Script-fu заявляет о TinyScheme, поэтому я ожидаю, что она будет действительно существенной, с небольшой библиотечной поддержкой, в отношении более полных реализаций Scheme

Во всяком случае, я попробовал несколько примеров на матрицах "Схема пути". Для простоты им не хватает контроля над входными данными, но для простых примеров они отлично работают на DrRacket.

(define (vect-sum x y)
  (cond 
    ((empty? x) empty)
    (else 
     (cons (+ (first x) (first y)) (vect-sum (rest x) (rest y))))))

(define (scalar-prod a v)
  (cond
    ((empty? v) empty)
    (else
     (cons (* a (first v)) (scalar-prod a (rest v))))))

(define (matr-sum x y)
  (cond
    ((empty? x) empty)
    (else
     (cons (vect-sum (first x) (first y)) 
           (matr-sum (rest x) (rest y))))))

(define (matr-scalar-prod a m)
  (cond
    ((empty? m) empty)
    (else
     (cons (scalar-prod a (first m)) (matr-scalar-prod a (rest m))))))

А теперь простой тест на данных, как в другом ответе:

> (define m '((3 3 3)(5 3 4)(4 4 4)))
> m
'((3 3 3) (5 3 4) (4 4 4))
> (matr-scalar-prod 3 m)
'((9 9 9) (15 9 12) (12 12 12))
0 голосов
/ 28 апреля 2011

HHi, я настоятельно рекомендую вам использовать Python вместо Scheme для написания сценариев GIMP, если вы не хотите изучать Scheme для развлекательных целей.

Один из принципов Python - запретить языку оставаться между вами и вашей проблемой, и написание собственного кода манипулирования матрицей тривиально. Если вам нужны высокопроизводительные операции, вы можете использовать стороннюю библиотеку, такую ​​как NumPy (даже из среды GIMP), чтобы получить ее.

Итак, для класса Matrix, который позволил бы скалярное умножение и сложение, можно просто написать:

class Matrix(object):
    def __init__(self, rows, cols, *args):
        self.rows = rows
        self.cols = cols
        self.values = args

    def __getitem__(self, (i,j)):
        return self.values[i * self.cols + j]

    def __setitem__(self,(i,j), value):
        self.values[i * self.cols + j] = value

    def __add__(self, other):
        values = []
        for i in range(self.rows):
            for j in range(self.cols):
                values.append(self[i,j] + other[i,j])
        return Matrix(self.rows, self.cols, *values)

    def __mul__(self, N):
        return Matrix(self.rows, self.cols,*(N * v for v in self.values))

    def __repr__(self):
        return "\n".join (" ".join(str(self[i,j]) for j in range(self.cols))   for i in range(self.rows) ) 

Пример на интерактивной консоли Python:

>>> m = Matrix(3,3,
... 3,3,3,
... 5,3,4,        
... 4,4,4)    
>>> m * 3
9 9 9
15 9 12
12 12 12

Реализация большего количества операций одинаково проста, и для вызова API-функций GIMP с этим примером класса вы можете просто использовать m.values, который представляет собой просто список со всеми значениями матрицы в последовательности - как в GIMP PDB функции используют их. (Например, pdb.gimp_drawable_transform_matrix или pdb.plug_in_convmatrix. (Я полагаю, вы нашли браузер API GIMP в меню справки - те же функции доступны в Scheme и в Python, просто замените «-» в именах «_» )

...