> 1 <

Автор Сообщение

AndreyMust19

Members


Статус

4 сообщений

Где: Russia
Род занятий:
Возраст:

#4272   2011-05-13 17:51 GMT+3 часа(ов)      
На этом диалекте пишутся скрипты для графич. редактора GIMP.
Оказалось в нем нет 2/3 функций языка Common Lisp, а именно разрушающих функций и чтение/запись по ссылке.

На данный момент надо выполнить сортировку элементов списка по возрастанию. Функции sort нет, равно как и многих других функций и функционалов.

Пока написал вот что:

(let* ((b '())(buffer '(3 2 1)))
(while (not (null? buffer))
(eval (cons 'min buffer))
(set! b (append b (list (car buffer))))
(print b)
(set! buffer (cdr buffer))
))


Этот код находит минимальных элемент в списке (3 2 1) и сохраняет его в конец другого списка (пока первый список не закончится).
Но есть сохранять функцией set!, то значение buffer в
(eval (cons 'min buffer))

не вычисляется заново и список b состоит из единиц.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4274   2011-05-13 22:33 GMT+3 часа(ов)      
Цитата
AndreyMust19 :
Пока написал вот что:
(let* ((b '())(buffer '(3 2 1)))
(while (not (null? buffer))
(eval (cons 'min buffer))
(set! b (append b (list (car buffer))))
(print b)
(set! buffer (cdr buffer))
))


OMG

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4276   2011-05-13 23:31 GMT+3 часа(ов)      
http://groups.engin.umd.umich.edu/CIS/course.des/cis400/scheme/sorts.html
Вроде рабочее. Я, кстати, тоже на гимпе сейчас рисую, пока только кнопки, придётся со скриптами разбираться.
I wish I'd made you angry earlier

AndreyMust19

Members


Статус

4 сообщений

Где: Russia
Род занятий:
Возраст:

#4278   2011-05-14 01:52 GMT+3 часа(ов)      
Спасибо megamanx!
Теперь у меня есть сортировка и обмен!
Я так и думал что сортировку придется руками делать.

Не могли бы поделиться советом как эту ссылку нашли?

Пока запишу - какие велосипеды еще нужно изобрести:
Цитата
defvar, defparam
set, setq, setf
push, pop, rplaca, rplacd, first...twelve
nconc
sort-stable qsort
list-length
reduce
* Функционалы: elt, remove, make-sequence, some, every


Это названия функций из тех, что пытался вводить, к-е отсутствуют в Script-Fu. Просто к сведению.

Зато есть:
Цитата
list length
cons cons-array
define
let let*
set! aset
car cdr nth
rand
append

if cond when null?
while

string-append
number->string
nreverse
time

* Функционалы: map, mapcar

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4279   2011-05-14 03:01 GMT+3 часа(ов)      
Script-Fu в качестве интерпретатора использует TinyScheme.

отредактировал(а) misha: 2011-05-14 03:24 GMT+3 часа(ов)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4281   2011-05-14 13:53 GMT+3 часа(ов)      
слушай старших, там действительно схема, т.ч defun и defar не будет, как и макросов, а setf -> set! и т.д.
а нашёл в гугле gimp scheme sort
I wish I'd made you angry earlier

AndreyMust19

Members


Статус

4 сообщений

Где: Russia
Род занятий:
Возраст:

#4282   2011-05-14 18:44 GMT+3 часа(ов)      
Готов скрипт медианной фильтрации с длиной 3 для удаления высокочастотных помех.

Цитата

; width - длина изображения, height - ширина
; len - меньшая сторона изображения
; drawable - область рисования (слой)
; pix - один пиксель, 1 - номер изображения
(define (script-fu-mediana image drawable)
(let* ((width (car (gimp-image-width image)))
(height (car (gimp-image-height image)))
(len (min width height)) (pix)
(w 0) (h 0) (buf '(0 0 0)) (buf-size 3) (n 1))
; выводим на экран размеры изображения
(print (list 'width= width 'heigth= height))
; узнаем номер текущего слоя
(set! drawable (car (gimp-image-get-active-layer image)))
(print (list 'drawable= drawable))

(while (<= w buf-size)
(set! pix (gimp-drawable-get-pixel drawable w h))
(set! pix (vector-ref (cadr pix) (- (car pix) 1)) )
(set! buf (append (cdr buf) (list pix)))
(print (list 'buf= buf))
(set! w (+ w 1)))
; спрашиваем цвет одного пикселя

(while (< h height)
(while (< w width)

(print (list "0 " 'w= w 'h= h))
(set! pix (gimp-drawable-get-pixel drawable w h))
(set! pix (vector-ref (cadr pix) (- (car pix) 1)) )
(set! buf (append (cdr buf) (list pix)))
; (print (list "1 " 'buf= buf))

; (print (list "1 " 'buf= buf))
(set! pix (nth (floor (/ buf-size 2)) (sort buf <)) )
; (print (list "2 " 'pix= pix))
(gimp-drawable-set-pixel drawable w h 1 (vector pix))
; (print 4)
(set! w (+ w 1))
)
;(print (list 'w= w 'h= h))
(set! w 0)
(gimp-progress-update (/ h height))
(set! h (+ h 1))
)

(gimp-drawable-update drawable 0 0 width height)
(gimp-displays-flush)
(gimp-progress-update 1.0)))



К сожалению, над серым изображением размером 256x256 скрипт работает 7 минут.
Не знаете как ускорить работу скрипта? Я читаю пиксели по одному, может поэтому тормозит? Как прочитать все изображение в список и потом сохранить рисунок из списка?

Извините что так, в теге code длинные строчки не отображаются.

GIMP 2.6.11

отредактировал(а) AndreyMust19: 2011-05-14 19:12 GMT+3 часа(ов)

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4283   2011-05-15 00:45 GMT+3 часа(ов)      
Вот моё злое ухо. В данный момент пишу с переменным успехом cbir.
Я делаю фильтры сначала в матлабе, потом переношу на яву дословно, потом оптимизирую; если припрёт, прошу знакомых перенести часть алгоритмов на куду. ИМХО, скриптовый язык вставлялся для оптимизации обработки большого количества изображений (применить готовый алгоритм из библиотеки для 10000 файлов, рассованных по папкам), а не для написания собственных фильтров.
Если припёрло именно с гимпом, то есть http://gmic.sourceforge.net/index.shtml

отредактировал(а) megamanx: 2011-05-15 01:57 GMT+3 часа(ов)
I wish I'd made you angry earlier

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#4293   2011-05-16 15:28 GMT+3 часа(ов)      
Фильтр можно написать Си, зачем для этого Script-Fu? Если бы я хотел реализовать плагин на Racket, то реализовал бы на C/C++ модуль для Racket(по сути специальную dll), прописал бы в нем экспорт и т.д. Откомпилировал, и использовал бы как обычный модуль.
Например,
(require "plug-in.rkt")
И Racket'у пофиг существует ли модуль "plug-in.rkt", главное что бы существовал "compiled/.../plug-in_rkt.dll".

AndreyMust19

Members


Статус

4 сообщений

Где: Russia
Род занятий:
Возраст:

#4329   2011-05-18 17:54 GMT+3 часа(ов)      
Скомпилированный модуль на Си работает мгновенно, не то что Script-Fu. Ускорение вызвано еще тем, что я использовал чтение строки пикселей, к-е недоступно для Script-Fu. Если писать точно также (читать каждый пиксель отдельно), функция работает всего 3 секунды.
На Script-Fu проще писать интерфейс для указания параметров. Т. е. функцию, к-я спрашивает параметры, я написал на Script-Fu, а функцию, к-я эти параметры принимает - на Си.
> 1 <


Онлайн :

0 пользователь(ей), 37 гость(ей) :




Реклама на сайте: