пятница, 19 декабря 2008 г.

Wand-mode - алгоритм устранения красных глаз

Внимание!

Для корректного отображения этой страницы вашему браузеру необходима поддержка формата MathML.

Как и обещал напишу про то, как улучшить алгоритм устранения красных глаз у Wand-mode и как его тестировать. Возможно, что найдутся желающие его поковырять и улучшить ибо я не эстет да ещё и дальтоник к тому же, так что доволен тем, что есть и сейчас.

Описание алгоритма

Вкратце, проходим по всем пикселям выделенной области и смотрим на их красноту. Если пиксел достаточно красный, то заменяем его на тёмный. Затем немного размываем пикселы лежащие внутри эллипса, вписанного в выделенную область. Определение красности пиксела и его замена на более тёмный происходит в функции Wand-fix-red-pixels. Аргумент PIXELS, который она принимает — это список троек, где каждая тройка имеет вид (RED GREEN BLUE). RED, GREEN и BLUE принимают значения от 0 до 255.

После того как пикселы подправлены краснота уйдёт, но кое-где могут остаться резкие перепады цвета. Для того чтобы их сгладить мы накладываем эллиптическую маску (ибо зрак, в основном, круглой формы ;)) и применяем размытие по Гауссу с радиусом, который нам выдаст функция Wand-mode-redeye-blur-radius.

С чего начать

Неплохим началом в ковырянии алгоритма может стать функция Wand-mode-redeye-blur-radius. Это должна быть такая хитрая функция, которая даёт небольшие значения для маленьких входных и очень медленно растёт. Сейчас это убогая WH16 , где W — ширина выделенной области, а H — высота.

Тестирование улучшенного алгоритма

Для начала скачайте вот эту картинку с примерами красных глаз. Затем для тестирования вам понадобится следующая команда:

(defun Wand-test-redeye (arg)
  "Apply redeye reduction algorithm to ARG's region."
  (interactive "p")
  (let ((pp '(((41 41 349 302) (39 34 86 307)
               (44 42 354 58) (47 42 94 151))      ; first region
              ((29 31 315 676) (36 33 108 660)
               (86 79 168 468))                    ; second region
              ((28 26 335 885) (26 25 147 930)
               (21 18 267 774) (21 18 129 792))    ; third region
              ((26 26 343 1219) (28 29 87 1161)
               (25 18 294 1044) (23 18 127 1036))  ; fourth region
              ((17 15 431 1468) (18 17 376 1463)
               (17 20 310 1468) (17 20 232 1477)
               (13 15 116 1458) (13 15 25 1466)
               (23 25 253 1336) (21 25 132 1378))  ; fifth region
              )))
    (mapc (lambda (reg)
            (Wand-operation-apply 'redeye-remove image-wand reg))
          (nth (1- arg) pp))
    (Wand-redisplay))) 

Откройте картинку redeye-samples.jpg с помощью M-x Wand-display RET. Тестировать алгоритм устранения красных глаз можно с помощью команды C-u <NUM> M-x Wand-test-redeye RET, где <NUM> это номер области над которой нужно произвести тестирование. Как видно из кода всего есть 5 областей. После выполнения команды проверьте результаты с помощью программы для увеличения, я предпочитаю Lupe — быстро работает и вообще отличный софт. Если для всех областей результаты схожи с тем что справа, то у вас неплохо получилось.

Присылайте результаты в список рассылки sxemacs-devel@, для лучшего варианта предусмотрен приз ;)

ReST source Скачать оригинал

1 комментарий:

lg комментирует...

ого, что-то мой mathml не распознался. Как я ненавижу когда между писателем и читателем есть посредник :)

имелось ввиду корень 16 степени из W*H