Показаны сообщения с ярлыком обработка. Показать все сообщения
Показаны сообщения с ярлыком обработка. Показать все сообщения

Небольшая шпаргалка по командам SVN



33 коммент.
В этом посте я решил собрать простые и наиболее часто используемые мной команды svn, часть параметров и способов работы с репозиториями svn, которых я склонен забывать. Это своеобразная шпаргалка, описание subversion на простых примерах. Чтобы теперь находки по работе в subversion никуда не потерялись - им место в блоге.

По ходу действия хочу подчеркнуть, что Subversion, хотя и является инструментом в первую очередь для программистов, может использоваться и людьми, от программирования достаточно далёкими. Если вы имеете дело с документами в формате LaTeX, то никто не запрещает использовать Subversion или любую другую систему контроля версий: LaTeX в общем тоже язык программирования оформления документов, так что использование Subversion будет так же продуктивно.

Пример, который я люблю приводить своим студентам - их диплом. Большой документ, много текста и картинок. Обычно написание диплома в форматах, к тому не предназначенных, приводит к кошмару вида diplom-pupkin-last-best-new-cool-version45.doc с полным непониманием того, что изменилось в 44 версии и как посмотреть, много ли поменял научный руководитель в тексте с прошлой встречи. Subversion, будучи использованной вместе с LaTeX, избавляет от головной боли и других нежелательных расстройств при написании диплома или (того хуже) диссертации.


Наполнение репозитория Subversion
Репозиторий, созданный командой:
$ svnadmin create /usr/local/svn/newrepos
нужно наполнить свежими данными. Для этого есть команда svn import это быстрый способ скопировать не версионированное дерево файлов в хранилище, например:
$ svn import mytree file:///usr/local/svn/newrepos/some/project \
-m "Initial import"
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h

Committed revision 1.

Стоит заметить, что после завершения импорта, оригинальное дерево файлов не конвертируется в рабочую копию. Для того, чтобы начать работать вам необходимо создать новую рабочую копию (svn checkout) дерева файлов.


Добавление новых файлов и каталогов в репозиторий Subversion
Например, вы создаёте крупный документ в ЛаТеХе, и появился новый каталог с новыми текстами или картинками. Как их добавить в Subversion репозиторий? Очень просто:
$ svn add temp A temp A temp/Lit_obzor2_edt.tex

Теперь смотрим на статус наших файлов и видим, что против них стоит буква А - значит, они Added, то есть добавлены:

$ svn status
? image
? biblio
? optcodeimages
M draft_PhD_Konnik.dvi
! PhD_Konnik.log
A temp
A temp/Lit_obzor2_edt.tex
! PhD_Konnik.toc
M PhD_Konnik_chapter_results.tex~
! PhD_Konnik_chapter_introduction.dvi
! PhD_Konnik.aux
! PhD_Konnik.bbl
! draft_PhD_Konnik.log
! PhD_Konnik.blg
! draft_PhD_Konnik.toc
! draft_PhD_Konnik.aux
! draft_PhD_Konnik.bbl
M PhD_Konnik.dvi
! draft_PhD_Konnik.blg
M PhD_Konnik_chapter_results.tex
! PhD_Konnik_chapter_introduction.log

Они будут помещены в репозиторий при следующей отправке (commit).

Обновление рабочей копии до состояния репозитория
Файлы, находящиеся в репозитории свежее, чем у вас в рабочей копии. Дубовый вариант заключается в том, чтобы удалить свою рабочую копию и сделать chekout из репозитория. Это проходит, если репозиторий только ваш и вы уверены, что никаких изменений в рабочей копии вы не потеряете. Но есть вариант и получше:
$ svn update U
biblio/my.bib
U
biblio/my.bib.bak

Updated to revision 9.

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

Латинские буквы перед именем файла имеют свой сакральный смысл, скрытый в недрах документации сокрушительных размеров (кстати, документация очень хороша, и есть даже частичный перевод на русский тут). Собственно, буква означает действие, которое выполнил Subversion для приведения рабочей копии в актуальное состояние:
U foo

Updated — Файл foo был обновлен


A foo

Added — Файл или директория foo были добавлены в рабочую копию.


D foo

Deleted — Файл или директория foo были удалены из рабочей копии.


R foo

Replaced — Файл или директория foo была заменена в рабочей копии; это значит, что foo был удален, а новый элемент с таким же именем был добавлен.


G foo

merGed — Файл foo получил новые изменения из хранилища, однако ваша локальная копия содержит ваши
изменения. Либо изменения не пересекаются, либо они точно такие же, как ваши локальные изменения, поэтому Subversion успешно выполнил слияние изменений хранилища с файлом.


C foo

Conflicting — Файл foo получил от сервера конфликтующие изменения. Изменения с сервера пересекаются с
вашими изменениями фала.


Просмотр истории ревизий в Subversion
Часто нужно просмотреть, что и как редактировалось - для этого при отправке новых данных в репозиторий (commit) есть смысл писать содержательные и осмысленные комментарии. Если это так, то можно многое узнать о том, что и когда редактировалось:
$ svn log --revision 1:3
что значит: выдать лог ревизий с первую по третью. Увидим:
----------------------------------- r1 | penta4 | 2008-06-03 15:49:21 +0400 (Втр, 03 Июн 2008) | 1 line Initial dissertation state
--------------------------------
r2 | penta4 | 2008-06-03 16:56:01 +0400 (Втр, 03 Июн 2008) | 3 lines Committed new editions
---------------------------------
r3 | penta4 | 2008-06-03 16:58:12 +0400 (Втр, 03 Июн 2008) | 2 lines incremental ------------------------------------------------------------------------


Очень удобно, когда нужно кому-то отправить историю правок вашей программы или документа.


Просмотр изменений в Subversion
Например, нужно просмотреть изменения, происшедшие со второй по четвёртую ревизии. Легко!
$ svn diff --revision 2:4 PhD_Konnik.tex > PhD_Konnik.tex.diff.r2-4
Это выведет нам в diff-файл все изменения, а ваш любимый текстовый редактор их с удовольствием подсветит для более удобного просмотра.



Отмена изменений в Subversion

Вы сидите и правите какой-то документ - и тут с ужасом понимаете, что правите _не тот_ документ. Не беда - переносите изменения во временный файл, а для того документа, который вы нечаянно испортили, пишем:
$ svn revert UMNIK08-Report-01/Report-01-sub1-shortened.tex
Reverted 'UMNIK08-Report-01/Report-01-sub1-shortened.tex'
После этого SVN вернёт файл Report-01-sub1-shortened.tex в то состояние, в котором он находится в репозитории.


Копирование или перемещение нескольких файлов в SVN/Subversion (multiple targets move/copy in SVN)
Странно, однако SVN не понимает символов типа *, так что ваша попытка сделать так:
$ svn mv MCBC/*jpg LinuxImages/
приведёт к ошибке:
svn: Client error in parsing arguments
Чтобы не перемещать все файлы по одному, воспользуемся _ваша любимая оболочка тут_, в моём случае это Bash:
for i in *.cs ; do svn mv $i newFolder/ ; done
Конечно, если в вашей операционной системе есть нормальная консоль :-)


Выдача определённой правки файла из репозитория
Например, нам очень нужно посмотреть, каким был файл при второй правке. Для этого пишем:
$ svn cat --revision 2 PhD_Konnik.tex > PhD_Konnik.tex.v2
То есть выводим результат второй правки файла PhD_Konnik.tex и записываем его в файл PhD_Konnik.tex.v2 для дальнейшего просмотра.


Восстановление удалённых файлов в Subversion
Ну и наконец самое страшное: вы приказали Subversion удалить файл из репозитория, а потом кто-то вам говорит: этот файл нужно вернуть. На самом деле, файл, который вы удалили из SVN, никуда не делся: элемент исчезает из правки HEAD, но продолжает существовать в более ранних правках. Так что вопрос "как восстановить удалённый файл в Subversion" имеет довольно простой ответ: скопировать его из последней правки, где он был.

Главное вспомнить, как этот файл назывался. Если помним хотя бы частично имя файла (например, overview), то можно попросить Subversion вывести все упоминания о правках этого файла так:
svn log -v | grep spatialcoh -A 5 -B 5
Здесь параметры для grep такие: -A 5 это выдача 5 строк после (After) совпадения, -B 5 это 5 строк до (Before) совпадения. Получим длинный вывод вида:
spatialcoherencyexplained.eps 436 | penta4 | 2009-12-02 15:39:30 +0300 (Срд, 02 Дек 2009) | 2 lines
Changed paths:
M /PhD_Konnik_autoreferat.tex
M /PhD_Konnik_chapter_opticalcoding.tex
M /PhD_Konnik_chapter_overview.tex
D /images-opticalcoding/spatialcoherencyexplained.eps
M /images-opticalcoding/sxemacorrelator3.eps
M /latex.py
M /svnstatus.tex
M /zagashnikPhD_Konnik.tex

--
M /biblio
A /formaldocs/disserDocs.tif.7z
A /images-opticalcoding/PSFdotssize.eps
M /images-opticalcoding/PSFoutofLambdaDeltaLambdavsfromNumberOfElementsPSFRus.ps
A /images-opticalcoding/auxilaryImagesForDisser.svg
A /images-opticalcoding/spatialcoherencyexplained.eps
M /zagashnikPhD_Konnik.tex

TENGIBLE changes:
- autoreferat is improved slightly;
- Spatial coherency is improved
Красным подчеркнул я: видно, что файл
spatialcoherencyexplained.eps удалён в правку 436, и теперь хотим его восстановить. Смотрим, в какой правке файл был удалён - в 436, значит, в 435 есть его последняя копия. Восстанавливаем:
svn copy --revision 435 file:///phdthesis/images-opticalcoding/spatialcoherencyexplained.eps spatialcoherencyexplained.eps
Всё, теперь файл появится снова, вместе с историей правок (что важно) и вы можете его править дальше.

Ссылки
Разумеется, это далеко не все возможности Subversion - в данном посте не рассмотрены возможности создания и слияния веток, но в качестве быстрого введения должно хватить. Больше есть в переведённом на русский исчерпывающем мануале тут.
Читать далее

Научная поисковая система на вашем Linux-десктопе



10 коммент.
Некоторое время назад я писал о SWISH++, и вот теперь мне хотелось бы обобщить написанное в более краткой форме. Проблема поиска нужной статьи, если не помнишь точно где она находится в каталогах, действительно серьёзная.


1. Поиск дубликатов
Итак, когда я накачал нужных мне статей из Интернета, я прежде всего смотрю, есть ли они у меня в коллекции с помощью fdupes. Эта программа ищет дубликаты файлов:
$ fdupes -rd .
Точка в конце говорит о том, что искать дубликаты fdupes будет, начиная с текущего каталога, поэтому можно в каталоге со статьями сделать подкаталог 1/ и набросать туда скачанные статьи.

Fdupes сравнивает файлы как побайтово, так и с помощью подсчёта md5-суммы, работает невероятно быстро, сортировка производится в полуавтоматическом режиме: программа выводит в консоли дублирующиеся файлы и спрашивает, какой из них оставить. Об этом уже говорилось в статье о подходах к сортировке PDF-файлов.


2. Индексация текста в PDF-файлах
Сначала из
документов pdf вытаскиваем текст, для чего просим утилиту find найти все файлы PDF и для каждого найденного выполнить pdftotext без выдачи предупреждений и без вставки символов разрыва страницы:
find -name '*.pdf' -exec pdftotext -nopgbrk -q {} \;
Надо отметить, что pdftotext хорошо работает только для английского языка, на котором, в общем, все статьи и написаны.

Теперь индексируем все текстовые файлы - в этом нам поможет собрат SWISH++ по имени index++ для индексации текстовых файлов:
index++ -e "text:*.txt" .
Точка в конце означает, что поиск ведётся с текущего каталога. Подробнее об индексации и автоматизации этого процесса сказано здесь.

В результате в текущем каталоге появится файл swish++.index где, собственно, лежит информация об индексировани файлов. Теперь всё готово для поиска.


3. Ищем в архиве статей нужное
Для поиска используем search++ которая найдёт по нашему запросу в индексированной базе swish++.index файлы. Вот пример поиска статьи по математической морфологии, в которых нет упоминания про медицину:
$ search++ morphology and erosion and dilation not medicine
Мгновение спустя вижу результат (вывод сокращён):
# results: 125
99 ./Krylov2.txt 3771 Krylov2.txt
49 ./13300407.txt 3103 13300407.txt
46 ./morph1.slides.printing.6.txt 4369 morph1.slides.printing.6.txt
37 ./lecture_morphology_sara.txt 6746 lecture_morphology_sara.txt
30 ./SIGGRAPH2002_Sketch-Mitchell.txt 5308 SIGGRAPH2002_Sketch-Mitchell.txt
26 ./MorphologicalImageProcessing.txt 7642 MorphologicalImageProcessing.txt
25 ./phdsymp2002_ledda.txt 8298 phdsymp2002_ledda.txt
23 ./lab2_manual.txt 9313 lab2_manual.txt
23 ./Project 1.txt 9946 Project 1.txt
22 ./morphology.txt 11212 morphology.txt
22 ./edg/morphology.txt 11212 morphology.txt
22 ./slides-6-geometry.txt 11717 slides-6-geometry.txt
22 ./V1BFOGG8.txt 10797 V1BFOGG8.txt
18 ./71650638.txt 13978 71650638.txt
Первая колонка - релевантность, вторая - расположение файла относительно текущей директории, третья - размер файла, четвёртая - имя. Просто и понятно.

Теперь в консольке набираю kdpf
./Krylov2.pdf и смотрю нужную мне статью. И всё.

Ссылки
Собственно, документации о SWISH++ очень мало, так что в основном я решил собрать свои предыдущие записи в один пост:
- поиск и удаление дубликатов файлов с помощью fdupes;
- выделение текста из PDF-файлов и их индексация;
- поиск в индексированных файлах с помощью SWISH++
Читать далее

Чтение MAT-файлов MATLAB в nip2



3 коммент.
То, о чём так долго говорили красные, белые, зелёные, и даже голубые - свершилось. Теперь замечательный графический анализатор nip2 полностью поддерживает чтение MAT-файлов, в которых MATLAB записывает данные рабочего окружения с двойной точностью (double precision). И хотя в основной ветке этой возможности ещё нет, в SVN-репозитории оно уже появилось благодаря скромным усилиям автора этих строк и John Cupitt - одного из авторов nip2 и библиотеки VIPS.

На всякий случай: nip2 это графический анализатор изображений (это не привычный gimp или photoshop), который создавался специально для работы с огромными файлами и научных применений. Но он может быть полезен и простым пользователям: с его помощью легко открывать, просматривать, кадрировать огромные файлы. Или, например, склеить две фотографии в одну - как склеивают панорамы.


Для чего нужно открывать MAT-файлы в nip2
Упреждая возможные вопросы "а зачем нам проприетарный mat когда есть csv" отвечу: запись в открытый формат CSV в матлабе происходит несколько нетривиальным образом и можно записать только одну переменную. Более того, если забыть указать несколько важных параметров, можно сильно потерять в точности сохраняемых данных. И главное, что уже много результатов научных экспериментов сохранено в MAT-формате.

Периодически возникает необходимость быстро просмотреть эти данные (это изображения) в каком-нибудь просмотрщике без необходимости загружать MATLAB. Таковых просмотрщиков я не знаю - открыть MAT-файл может только GNU/Octave с помощью библиотеки matio. Так что эта возможность очень нужна и востребована.

Установка nip2 и VIPS

Хотя об установке nip2 я уже писал, тем не менее, повторюсь. Сначала нужно скачать отсюда из support-зоны самый свежак. Сначала собираем VIPS и устанавливаем пакет, потом собираем nip2 и тоже устанавливаем. Последние версии (vips7.18.XX) со старыми версиями Питона могут не собраться, так что для этого при сборке пользуем ключ --without-python и собираем.

Для себя и своих студентов я собрал пакеты под Debian Etch и архитектуру i386 (да-да, я в конкретном бронепоезде):
После этого добавляем программу в меню вашего оконного менеджера или запускаем прямо из графической консоли командой nip2.


Просмотр MAT-файлов MATLAB в nip2

Здесь всё довольно просто: в диалоге открытия явно указываем, что хотим просмотреть MATLAB's mat-files и далее открываем такой файл. Пример на скриншоте - легендарная Лена
(а кто такая Лена?)


А теперь примерчик посложнее - загружаем изображение усреднённых темновых шумов цифровой камеры и берём от них Фурье-преобразование (на том же скриншоте открыта в левом нижнем углу неудачная фотография от скоростной съёмки):


Так что наши данные теперь можно просмотреть без томительного ожидания, пока MATLAB откроет эти файлы. Кстати о данных в форматах CSV и MAT...


Данные в CSV и MAT-форматах: особенности записи MATLAB и просмотр nip2
Эту заметку я хотел сделать отдельным постом, но решил выложить здесь же. Появился тут вопрос: как сохраняет MATLAB данные с плавающей точкой в разных форматах. Для этого мы провели маленькое расследование...


Подготовка
Ответ состоит из нескольких частей. Да, Матлаб может сохранять данные в своём формате mat, и его может прочесть та же Octave (теперь и nip2 с использованием библиотеки matio). Для проверки сгенерируем матрицу

>> a = magic(5)

a =

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

>> b =a./3

b =

5.6667 8.0000 0.3333 2.6667 5.0000
7.6667 1.6667 2.3333 4.6667 5.3333
1.3333 2.0000 4.3333 6.6667 7.3333
3.3333 4.0000 6.3333 7.0000 1.0000
3.6667 6.0000 8.3333 0.6667 3.0000

>> b(2,2)=1.09878432753084573248523475
>> b(2,3)=2^20

Видим только первые четыре числа после запятой - это потому, что по умолчанию MATLAB отображает числа в коротком формате. Изменить этот формат можно командой format type.

Чтобы сделать задачу более наглядной, в матрицу записали два числа: одно с разными числами после запятой, а второе - очень большое (2^20). Теперь сохраняем в MAT-файл и CSV командами:
save('magic5x5doubleafterformatlong.mat', 'b'); %% это сохраняется MAT-файл
csvwrite('magic5x5double-afterformatlong.csv',b); %% это сохраняется CSV-файл

Теперь открываем их и сравниваем с исходниками...

Данные в MAT-файле.
В MAT-файлах всё чисто: он сохраняет так же, как и открывает.
>> load('magic5x5doubleafterformatlong.mat')
>> b
b =
1.0e+06 *
Columns 1 through 4
0.00000566666667 0.00000800000000 0.00000033333333 0.00000266666667
0.00000766666667 0.00000109878433 1.04857600000000 0.00000466666667
0.00000133333333 0.00000200000000 0.00000433333333 0.00000666666667
0.00000333333333 0.00000400000000 0.00000633333333 0.00000700000000
0.00000366666667 0.00000600000000 0.00000833333333 0.00000066666667
Column 5
0.00000500000000
0.00000533333333
0.00000733333333
0.00000100000000
0.00000300000000
>> b(2,2)
ans =
1.09878432753085
>> b(2,3)
ans =
1048576

Данные в CSV-файле.
А вот тут начинаются приключения. MATLAB записывает в CSV формат данные с точностью, такой же, как при отображении. То есть, например, при отображении используется вывод только первых 4 чисел после запятой - следовательно, сохранены они в CSV будут так же.

>> b(2,2)

ans =

1.0988

С большими числами тоже самое: они сохраняются в экспоненциальной форме с точностью, установленной для отображения (по умолчанию 4 знака). Это так же видно в CSV-файле (записывает с той точностью, с которой отображает). У одной и той же матрицы, сохранённой в CSV и MAT сходный размер.


>> b(2,3)=2^20

b =

1.0e+06 *

0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 1.0486 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000

>> b(2,3)

ans =

1048600

>> 2^20

ans =

1048576

Именно так оно и происходит по умолчанию: MATLAB просто округляет числа при записи в CSV до четырёх значащих чисел. Для того, чтобы запись происходила с нужной нам точностью в CSV, следует использовать команду dlmwrite и явно указывать точность. Например так:

>> dlmwrite('magic5x5double1-dlmwrite-precision12f.csv', b, 'precision', '%12.12f')

Это записывает матрицу в CSV формат с переменной b и обеспечивает точность 12 значащих чисел. Так что стоит аккуратнее обходиться с командами записи: csvwrite вам запишет, конечно, переменную, но с малой точностью. Это может стать источником трудноуловимых проблем.


Отображение данных в MAT и CSV форматах в nip2
Теперь, возвращаясь к теме поста, в последних версиях (nip2 и vips > 7.18.2) замечательного графического анализатора nip2 можно просматривать не только данные в CSV, но и в MAT-файлах. Это очень и очень удобная возможность: например, усреднённое изображение в MAT-файле можно проанализировать и посмотреть без необходимости загружать лишний раз MATLAB. Особенно это актуально, если изображение в MAT-файле больших размеров. Точность просмотра CSV и MAT-данных составляет 5 значащих цифр.
Читать далее

EXIF теги в Linux: зачем нужен EXIF



7 коммент.
В различных форматах графических файлов возможность хранить дополнительные сведения, например, время выдержки, значение диафрагмы, время или ещё что-нибудь. Это обеспечивает формат EXIF (Exchangeable Image File Format). В Linux для работы с EXIF данными есть такой мощный пакет утилит, как exiftools, всю полезность которого автор этих строк испытал на себе. Вот, например, потребовалось вам сохранить какие-то пометки о том, где сделан этот снимок - тут-то вам exiftools и пригодится.


Например, выдираем теги из RAW-файла на примере цифровой камеры Canon EOS 400D
exiftool IMG_0383.CR2 :
beast@notebeast:~$ exiftool IMG_0383.CR2
ExifTool Version Number : 6.57
File Name : IMG_0383.CR2
File Size : 8 MB
File Modification Date/Time : 2008:10:22 12:48:10
File Type : CR2
MIME Type : image/x-raw
Image Width : 1936
Image Height : 1288
Bits Per Sample : 8 8 8
Compression : JPEG (old-style)
Make : Canon
Camera Model Name : Canon EOS 400D DIGITAL
Preview Image Start : 79450
Orientation : Horizontal (normal)
Preview Image Length : 68724
X Resolution : 72
Y Resolution : 72
Resolution Unit : inches
Modify Date : 2008:10:15 15:44:26
Exposure Time : 1
F Number : 6.3
Exposure Program : Manual
ISO : 100
Exif Version : 0221
Date/Time Original : 2008:10:15 15:44:26
Create Date : 2008:10:15 15:44:26
Components Configuration :
Shutter Speed Value : 1
Aperture Value : 6.3
Flash : Off
Focal Length : 55.0mm
Macro Mode : Normal
Self-timer : 0
Quality : RAW
Canon Flash Mode : Off
Continuous Drive : Single
Focus Mode : Manual Focus
Canon Image Size : Unknown (-1)
Easy Mode : Manual
Digital Zoom : None
Contrast : Normal
Saturation : Normal
Sharpness : +3
Metering Mode : Center-weighted averaging
Focus Range : Not Known
Canon Exposure Mode : Manual
Long Focal : 55
Short Focal : 18
Focal Units : 1
Max Aperture : 5.6
Min Aperture : 32
Flash Activity : 0
Flash Bits : (none)
Focus Continuous : Unknown (8)
Zoom Source Width : 0
Zoom Target Width : 0
Photo Effect : Off
Color Tone : Normal
Focal Type : Zoom
Focal Plane X Size : 23.04mm
Focal Plane Y Size : 15.37mm
Auto ISO : 100
Base ISO : 100
Measured EV : -6.12
Target Aperture : 6.3
Exposure Compensation : 0
White Balance : Auto
Slow Shutter : None
Shot Number In Continuous Burst : 0
Flash Guide Number : 0
Flash Exposure Compensation : 0
Auto Exposure Bracketing : Off
AEB Bracket Value : 0
Focus Distance Upper : 0.77
Focus Distance Lower : 1
Bulb Duration : 0
Camera Type : EOS Mid-range
Auto Rotate : None
ND Filter : Unknown (-1)
Self-timer 2 : 0
Canon Image Type : Canon EOS 400D DIGITAL
Canon Firmware Version : Firmware 1.0.4
Owner's Name : unknown
Camera Body No. : 0730325266
Set Button Cross Keys Func : Set: Picture Style
Long Exposure Noise Reduction : Off
Flash Sync Speed Av : Auto
Shutter-AE Lock : AF/AE lock
AF Assist Beam : Emits
Exposure Level Increments : 1/3 Stop
Mirror Lockup : Disable
E-TTL II : Evaluative
Shutter Curtain Sync : 1st-curtain sync
Magnified View : Image review and playback
LCD Display At Power On : Display
Canon Model ID : EOS Digital Rebel XTi / 400D / Kiss Digital X
Num AF Points : 9
Canon Image Width : 3888
Canon Image Height : 2592
Canon Image Width As Shot : 3504
Canon Image Height As Shot : 2336
AF Points Used : (none)
Serial Number Format : Format 2
Original Decision Data : 0
File Number : 128-0000
Bracket Mode : Off
Bracket Value : 0
Bracket Shot Number : 0
Noise Reduction : Off
WB Bracket Mode : Off
WB Bracket Value AB : 0
WB Bracket Value GM : 0
Filter Effect : None
Toning Effect : None
Lens Type : EF-S18-55mm f/3.5-5.6
Internal Serial Number : H0885505
Dust Removal Data : (Binary data 1024 bytes, use -b option to extract)
Tone Curve : Standard
Sharpness Frequency : n/a
Sensor Red Level : 0
Sensor Blue Level : 0
White Balance Red : 0
White Balance Blue : 0
Color Temperature : 5200
Picture Style : Standard
Digital Gain : 0
WB Shift AB : 0
WB Shift GM : 0
Sensor Width : 3948
Sensor Height : 2622
Sensor Left Border : 52
Sensor Top Border : 23
Sensor Right Border : 3939
Sensor Bottom Border : 2614
WB RGGB Levels As Shot : 2236 1024 1024 1507
Color Temp As Shot : 5211
WB RGGB Levels Auto : 2236 1024 1024 1507
Color Temp Auto : 5211
WB RGGB Levels Measured : 2236 1024 1024 1507
Color Temp Measured : 5211
WB RGGB Levels Daylight : 2236 1024 1024 1507
Color Temp Daylight : 5200
WB RGGB Levels Shade : 2615 1024 1024 1253
Color Temp Shade : 7000
WB RGGB Levels Cloudy : 2427 1024 1024 1367
Color Temp Cloudy : 6000
WB RGGB Levels Tungsten : 1589 1086 1086 2509
Color Temp Tungsten : 3200
WB RGGB Levels Fluorescent : 1889 1034 1034 2126
Color Temp Fluorescent : 3769
WB RGGB Levels Kelvin : 2236 1024 1024 1507
Color Temp Kelvin : 5211
WB RGGB Levels Flash : 2479 1024 1024 1339
Color Temp Flash : 6262
WB RGGB Levels PC1 : 512 1024 1024 512
Color Temp PC1 : 4255
WB RGGB Levels PC2 : 512 1024 1024 512
Color Temp PC2 : 4255
WB RGGB Levels PC3 : 512 1024 1024 512
Color Temp PC3 : 4255
WB RGGB Levels Custom : 1201 1133 1133 5999
Color Temp Custom : 2400
User Comment :
Flashpix Version : 0100
Color Space : sRGB
Exif Image Width : 3888
Exif Image Length : 2592
Interoperability Index : R98 - DCF basic file (sRGB)
Interoperability Version : 0100
Focal Plane X Resolution : 4433.295
Focal Plane Y Resolution : 4453.608
Focal Plane Resolution Unit : inches
Custom Rendered : Normal
Exposure Mode : Manual
Scene Capture Type : Standard
Thumbnail Offset : 78336
Thumbnail Length : 1114
Photometric Interpretation : RGB
Samples Per Pixel : 3
Rows Per Strip : 256
Planar Configuration : Chunky
Strip Offsets : 443086
Strip Byte Counts : 7543495
Aperture : 6.3
Drive Mode : Single-frame shooting
Flash : Off
Image Size : 1936x1288
Lens : 18.0 - 55.0mm
Preview Image : (Binary data 68724 bytes, use -b option to extract)
Scale Factor To 35mm Equivalent : 1.6
Shooting Mode : Manual
Shutter Speed : 1
Thumbnail Image : (Binary data 1114 bytes, use -b option to extract)
WB RGGB Levels : 2236 1024 1024 1507
Blue Balance : 1.47168
Circle Of Confusion : 0.019 mm
Focal Length : 55.0mm (35mm equivalent: 85.9mm)
Hyperfocal Distance : 24.97 m
Lens : 18.0 - 55.0mm (35mm equivalent: 28.1 - 85.9mm)
Light Value : 5.3
Red Balance : 2.183594

Забавно, да, а что ещё можно с EXIF делать? Например, чтобы выцедить из RAW-файла время выдержки, сделать надо вот что:
exiftool -shutterspeed IMG_0383.CR2
Shutter Speed : 1
Для того, чтобы использовать exif-теги, надо запросить список тегов в которые возможна запись. Пишем:
exiftool -listw IMG_0383.CR2

Так, например из кучи тегов мы хотим писать в тег City. Для этого:

$ exiftool -City=Moscow IMG_0383.CR2
1 image files updated
И теперь:

$ exiftool -City IMG_0383.CR2
City : Moscow

Ура, теперь мы в тег City записали, что хотели. Утилита exiftools может не только читать, но и записывать информацию в EXIF-теги. Это может быть полезно и нужно для хранения в RAW-файлах информации о съёмке.


И зачем всё это надо!?
Причины, по которым есть необходимость модифицировать EXIF-данные в RAW-файлах могут быть разные. Вот, например, ув. тов. jetxee хочет в фотографиях хранить геотеги, то есть где фотография была снята.

Мне это потребовалось вот для чего. Результатами моих научных экспериемнтов являются куча RAW-файлов, и в каталоге лежит небольшой файл с условиями эксперимента (что снималось и для чего). Разные не очень технически продвинутые коллеги любят эти файлы копировать и использовать их где-то ещё (типа проверить и посмотреть), а потом говорят: "слушай, вот я тут картинку обработал, и результаты такие и такие - не помнишь, откуда этот файл!?". Хуже дело, если взяли по одному файлу из нескольких разных экспериментов и вот теперь надо разобраться, что откуда взято.

В общем случае экспериментатор при таком вопросе бледнеет и начинает громко говорить плохими словами. Но этого можно не делать: внедрить информацию в сам RAW-файл в какой-нибудь хитрый тэг. Потом так проще отследить файлы.

И теперь, чтобы избавить себя от нервотрёпки, делаем так: находим любой записываемый тег, и пишем туда то, что относится к эксперименту. После этого записываем нужные данные во ВСЕ файлы RAW скопом:
exiftool -City='Moscow Engineering Physics Institute' *.CR2

10 image files updated

С удовлетворением видим:
exiftool -City *.CR2
======== IMG_0383.CR2
City : Moscow Engineering Physics Institute
======== IMG_0384.CR2
City : Moscow Engineering Physics Institute
======== IMG_0385.CR2
City : Moscow Engineering Physics Institute
======== IMG_0386.CR2
City : Moscow Engineering Physics Institute
======== IMG_0387.CR2
City : Moscow Engineering Physics Institute
======== IMG_0388.CR2
City : Moscow Engineering Physics Institute
======== IMG_0389.CR2
City : Moscow Engineering Physics Institute
======== IMG_0390.CR2
City : Moscow Engineering Physics Institute
======== IMG_0391.CR2
City : Moscow Engineering Physics Institute
======== IMG_0392.CR2
City : Moscow Engineering Physics Institute
10 image files read

И всё дела. И уж теперь ваши нерадивые коллеги не введут вас в ступор вопросом: а отуда этот файлик!?

Здесь же, кстати, следует отметить, что EXIF данные можно записывать не только в RAW-файлы, но и в TIFF например. Однако полей для записи в TIFF меньше, хотя их тоже можно использовать.
Читать далее

Luminance HDR: создание HDR в Linux из нескольких кадров



12 коммент.
В этой заметке приводится краткое описание и впечатления по созданию изображений с высоким динамическим диапазоном HDR (High Dynamic Range). Изображения HDR в Linux можно с помощью программы Qtpfsgui, которая теперь называется Luminance HDR.

Небольшой исторический экскурс
Как справедливо отмечают авторы ресурса HDRmania, первое сообщение о процессе компрессии динамического диапазона обычных цифровых изображений, снятых с экспокоррекцией, появилось в 1993 г. А в 1995 году последовало появление соответствующей математической теории.
В 1997 году на конференции SIGGRAPH (Special Interest Group on GRAPHics and Interactive Techniques) Пол Дебевек (Paul Debevec), исследователь из Института Южной Калифорнии, представил метод соединения нескольких изображений, сделанных с разной экспозицией, для формирования единого HDR изображения. С ростом популярности цифровых фотоаппаратов и удобного для использования программного обеспечения термин HDR начал широко применяться для обозначения этого процесса. Более подробный обзор, с указанием на научные статьи, есть у меня на английском.


Cъёмка HDR-изображений
Для того, чтобы получить HDR-изображение, потребуется снять несколько кадров с разным значением экспозиции (или экспокоррекции). Напомню, что экпокорреция это поправка в экспозицию снимка относительно той, которая определена при помощи экспонометра. Для регистрации HDR-изображения:
  1. Устанавливаем камеру на штативе.
  2. Переводим камеру в ручной режим установки экспозиции. Выберите нужное значение диафрагмы для вашего кадра (например, f/8 или меньше, если вам нужна большая глубина резкости) и установите минимальное значение ISO.
  3. Изменяем освещённость в самой яркой части кадра (точечным замером или в режиме Av, чтобы учесть только её) и отмечаем время экспозиции. Сделайте то же самое с самой глубокой тенью в кадре.
  4. Определяем число и величину нужных экспозиций. Для этого возьмите за основу выдержку, измеренную для светлой части. Умножьте это число на 4, чтобы получить следующее значение экспозиции, отличающееся на 2 EV. Умножайте на 4 для получения следующих значений, пока не превысите экспозицию, измеренную для тени. Для большинства кадров вне помещения, не включающих солнце, 3 экспозиций с шагом 2 EV часто достаточно, чтобы покрыть весь динамический диапазон.
Напомню, что сдвиг экспозиции на 1 EV означает изменение количества света, попавшего на фотоматериал, в 2 раза. Для создания HDR-снимка часто достаточно сфотографировать три кадра: с экспокоррекцией -1 EV, 0 EV и +1 EV.


Работа с Luminance HDR в Linux

Трудновыговариваемое название программы Qtpfsgui объясняется самими авторами так: Qt это библиотека Qt4 для отображения графических элементов, pfs - главная внутренняя библиотека, а gui - Graphical User Interface, графический интерфейс пользователя. На такие названия, конечно, хочется попенять авторам - и они таки услышали! Теперь программа называется Luminance HDR. Сайт программы
Luminance HDR всё там же. Новые версии становятся всё удобнее и гламурнее:
From forBlogs


Итак, фотографии сняты и теперь можно приступить к созданию HDR-снимка. Запускаем Luminance HDR в Linux и выбираем все файлы изображений для HDR-фотографии сразу. После этого нас спросят об алгоритме построения HDR снимка. Это показано на рисунке ниже:


После этого будет рассчитано HDR-изображение из указанных снимков. Созданное изображение появится в главном окне программы:


Созданное изображение можно сохранить в один из форматов, поддерживающих HDR:
  1. OpenEXR (расширение: exr )
  2. Radiance RGBE (расширение: hdr)
  3. Tiff: 16bit, 32bit (float) и LogLuv (расширение: tiff)
  4. Raw (различные расширения)
  5. PFS native format (расширение: pfs)
Если же требуется просматривать созданное изображение обычными графическими просмотрщиками, имеет смысл прибегнуть к тональной компрессии снимка и сохранить его в JPEG/TIFF. Тональная компрессия это преобразования тональных значений изображения из более широкого диапазона в более узкий. Например, HDR изображение с динамическим диапазоном 100 000:1 будет преобразовано в изображение с тональными значениями в диапазоне от 0 до 255. Для этого нажимаем на кнопку Tonemap the HDR и выбираем один из методов тональной компрессии. Qtpfsgui содержит 8 алгоритмов тонального отображения, среди которых можно отметить следующие алгоритм Drago и Fattal.

Алгоритм Drago предназначен для имитирования восприятия человеческого глаза и полезен, когда нужно добиться естественных тонов. Алгоритм Fattal хорош для создания сюрреалистических, очень эффектных фотографий, однако он усиливает шумы и может создавать при одних и тех же параметрах из HDR фотографий при тоновой компрессии фотографии, выглядящие по-разному.

Для примера приведу HDR-изображение, которое я снял своей древней как мамонт камерой Casio QV-4000: три фотографии со значениями экпокоррекции -2EV, 0EV и +2EV пересчитаны в изображение с высоким динамическим диапазоном:

После применения тональной компрессии полученное HDR-изображение можно сохранить в форматах JPG или TIFF.

Ссылки
Ответы на часто задаваемые вопросы по HDR можно найти тут (на английском) и здесь, а так же можно посмотреть на образцы фотографий. Скачать Qtpfsgui можно на сайте авторов.
Читать далее

От фотонов до фотографии: от сырых данных к изображению



10 коммент.
В коммерческих цифровых фотокамерах используются CMOS и CCD фотосенсоры, сходные с теми, которые используются в технических цифровых камерах. Отклик таких фотосенсоров прямо пропорционален зарегистрированному излучению (если только это не логарифмическая камера). Однако фотография, сделанная в линейном режиме, выглядит бледной и мало контрастной. Для того, чтобы такое изображение было похоже на фотографию, применяются различные методы обработки изображений: интерполяция, гамма-коррекция, контрастирования и прочие. В общем, если хотите узнать, что происходит внутри камеры и как получается изображение - читайте.

Большинство современных цифровых фотокамер поддерживают вывод данных в ``сыром'' формате. При использовании соответствующего программного обеспечения и параметров конвертации, возможно получить необработанные данные из ``сырых'' данных фотокамеры, которые необходимы для широкого круга задач обработки изображений. К таким программным конвертерам можно отнести конвертер RAW-файлов DCRAW.

Следует, впрочем, отметить, что не все RAW-файлы являются необработанными. В случае CMOS-фотосенсоров предварительное шумоподавление происходит уже на сенсоре (об этом чуть ниже). Более того, некоторые производители коммерческих цифровых камер применяют нелинейную компрессию RAW-файлов, например некоторые камеры Nikon:
Leaving off Uncompressed NEF is potentially significant--we've been
limited in our ability to post process highlight detail, since some of
it is destroyed in compression.<...> There is some loss of data, mostly in the form of lowered resolution in the highlights.
<...>

In another disturbing development in Nikon's RAW formats saga, it seems they are encrypting white balance information in the D2X and D50 NEF format.

Однако большинство современных камер позволяют получать всё-таки линейные RAW-файлы.

В бытовой камере происходит обработка полученного с фотосенсора изображения прежде, чем оно будет записано в файл. И эта обработка - во всяком случае для CMOS фотосенсоров - начинается уже на сенсоре. Вот что происходит в цифровой камере перед выдачей красивой цветной фотографии:

0. Шумоподавление на чипе. Этот этап имеет место для CMOS фотосенсоров. Ещё до квантования из данных вычитается темновой пространственный шум (данные о шуме накапливаются в том же пикселе) и устраняется неоднородность усиления по столбцам (метод Correlated Double Sampling). Такие операции производятся прямо на пикселе (активные пиксели, технология 4/5Т) и электроникой камеры.

1. Квантование и запись сырых данных.
На этом этапе данные квантуются АЦП и записываются в память фотокамеры в виде RAW-файла. Этот файл содержит линейные данные и информацию об условиях съёмки (время экспозиции, диафрагма, значение ISO и проч.). Эти данные могут быть извлечены только специализированными конвертерами.

2. Удаление постоянной составляющей шума. На этом этапе конвертер вычитает из данных среднее значение шума чтения. Это значение вычисляется из данных ``вторичных пикселей'' (secondary pixels), закрытых от света и присутствующих на матрице (как правило, это ``рамка'' з пикселей толщиной 5-10 пикселей). Например, конвертер DCRAW при этом выводит диагностическое сообщение Scaling with black 256.

3. Цветовое масштабирование данных. Эта операция требуется для того, чтобы восстановить правильный баланс цветов на изображении. Для этого ``сырые'' данные в пикселях R G B G (составляющих баеровский шаблон светофильтров) умножаются на рассчитанные камерой константы. Например, DCRAW выводит такое диагностическое сообщение: multipliers 2.630775 1.000000 1.249379 1.000000, то есть пиксели R G B G умножаются соответственно на эти числа.

4. Цветовая интерполяция. Чтобы полутоновое изображение, каким является в RAW-файл, стало цветным, требуется восстановить недостающие цветовые компоненты для каждого пикселя: для пикселя R - синюю и зелёную компоненту, для G - красную и синюю, для B - красную и зелёную. Например, можно найти среднее между значениями ближайших соседних пикселей каждого цвета. Алгоритмы современных конвертеров более изощрённые, в результате чего артефактов на цветном изображении после интерполяции почти не заметно. Таким образом, изображение после интерполяции становится цветным.

5. Применение баланса белого.
Цветное изображение может выглядеть по-разному в зависимости от того, в каких условиях освещения оно снято. Соотношение пропорций красного, зелёного и синего для получения белого цвета и называется балансом белого. Поэтому пиксели цветного изображения, соответствующие разным цветам, умножаются на специально подобранные коэффициенты. После этой операции изображение становится похожим на снятое, например, в солнечном свете или в свете люминесцентной лампы.

6. Контрастирование.
Матрица фотоприёмника линейно реагирует на зарегистрированный свет, а отклик человеческого глаза на световое ощущение описывается сложной логарифмической кривой. Для того, чтобы изображение выглядело привычным для просмотра человеком, цветное изображение подвергается нелинейной коррекции яркости - гамма-коррекции. После этого цветное изображение, в котором учтён баланс белого, становится похожим на то, что видел глаз фотографа в видоискатель фотокамеры.

7. Шумоподавление. К шумам, всегда присутствующим на цифровом изображении, добавляются артефакты постобработки с предыдущих этапов. Для уменьшения шумов применяются разнообразные методы (как правило, сугубо нелинейные) шумоподавления. При этом мелкие детали, которые ведут себя очень похоже на шум, будут скорее всего утрачены, однако изображение будет выглядеть сглаженным и менее шумным.

8. Визуальное улучшение. Так как изображение уже сглажено, возможно применение различных методов подчёркивания деталей для повышения детализованности изображения.
Для наглядности привожу изображение, которое прошло все стадии обработки: шумоподавление на чипе, квантование и запись данных в RAW-файл, вычитание постоянной составляющей шума, цветовое масштабирование, интерполяция, применение баланса белого, визуальное улучшение.



А казалось бы - простая вещь, цифровая фотокамера...
Читать далее

Создание документов DJVU в Linux



44 коммент.
Задача: имеется отсканированная большая книга, и требуется перевести её в компактный формат для последующего просмотра в том же djview. В общем, нужно создавать документы DjVU в Linux.
Решение: в Linux просто и легко конвертируем насканированные страницы в DJVU.


Почему DJVU?
Потому, что есть множество отсканированных книг, и есть потребность их компактно хранить и работать с ними. Для этой задачи орлы из AT&T Labs разработали специальные алгоритмы сжатия, которые легли в основу формата DJVU.

Такие электронные книги занимают меньше места, чем, скажем, в PDF, PS или других форматах, и быстрее отображаются при просмотре.


Что потребуется для создания DJVU файлов из изображений
Для того, чтобы сконвертировать много изображений в DJVU нужно установить следующие пакеты:
aptitude install djview djvulibre-bin netpbm
При сканировании следует именовать файлы подряд так, чтобы они сортировались в порядке нумерации страниц. То есть вот так:

000.jpg, 001.jpg, 002.jpg, ..., 012.jpg

а не так:
0.jpg, 1.jpg, 2.jpg, ..., 12.jpg

потому как 12.jpg появится перед 2.jpg - так что при сканировании нужно об этом подумать.

Файлы изображений помещаются в отдельный каталог, после чего переходим в этот каталог и даём команду:
./any2djvu-bw
Эта команда - вызов скрипта оболочки, текст которого приведён ниже:

#!/bin/bash
#
# any2djvu-bw
#

if [ -z `which anytopnm` -o -z `which ppmtopgm` -o -z `which pgmtopbm`\
-o -z `which cjb2` ]; then
usage
echo "Error: anytopnm, ppmtopgm, pgmtopbm and cjb2 are needed"
echo
exit 1
fi

shopt -s extglob

# DEFMASK="*.jpg"
DEFMASK="*.png"
DPI=300
# uncomment the following line to compile a bundled DjVu document
OUTFILE="#0-bw.djvu"

function usage() {
echo
echo "usage:"
echo
echo "$0 [\"REGEXP\"]"
echo " converts single pages with the default mask $DEFMASK (or REGEXP if provided)"
echo " in the current directory to single-page black and white djvu documents"
# uncomment the following line to compile a bundled DjVu document
echo " and bundles them as a djvu file $OUTFILE"
echo
}

if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi

for i in $MASK; do
if [ ! -e $i ]; then
usage
echo "Error: current directory must contain files with the mask $MASK"
echo
exit 1
fi
if [ ! -e $i.djvu ]; then
echo "$i"
anytopnm $i | ppmtopgm | pgmtopbm -value 0.499 > $i.pbm
# in netpbm >= 10.23 the above line can be replaced with the following:
# anytopnm $i | ppmtopgm | pamditherbw -value 0.499 > $.pbm
cjb2 -dpi $DPI $i.pbm $i.djvu
rm -f $i.pbm
fi
done

# uncomment the following line to compile a bundled DjVu document
djvm -c $OUTFILE $MASK.djvu

Красным в скрипте выделена строчка, где определяется, какой формат файлов будет преобразован в DJVU. В данном примере это png.

Итак, в результате работы скрипта появятся промежуточные файлы djvu и файл #0-bw.djvu - это и есть конечный файл, содержащий в себе все страницы. Переименовываем его в то, что более приятно глазу, и готово. После этого можно открыть полученный файл при помощи djview или evince.


Так же перевести документы в формат DJVU можно и другими утилитами.

any2djvu
Это веб-сервис, находящийся тут. Он позволяет перевести отсканированные изображения непосредственно в файл DJVU. Удобно для тех, у кого широкий и дешёвый интернет-канал.

Так же можно воспользоваться кодом, предложенным комментатором с OpenNet:

#!/usr/bin/perl -w

my $i = 0;

my @cmds = qw[ djvm -c output.djvu ];
foreach ( <*.*> ) {
if (/(.*)\.jpg$/ ){
print "$_\n";
# system("c44", '-crcbfull', $1.'.jpg', $1.'.djvu');
system("cpaldjvu", $1.'.jpg', $1.'.djvu');
$i++;
push @cmds, $1.'.djvu';
}
elsif (/(.*)\.tif$/ ) {
print "$_\n";
# установить 300 dpi в tiff'e
#system("tiffset", '-s 296 2', $1.'tiff');
#system("tiffset", '-s 282 300.0', $1.'tiff');
#system("tiffset", '-s 283 300.0', $1.'tiff');
# или
# system("cjb2", '-dpi', '300', '-losslevel', '100', $1.'.tiff', $1.'.djvu');
system("cjb2", $1.'.tif', $1.'.djvu');
$i++;
push @cmds, $1.'.djvu';
}
}
print "$i files renamed\n";
system(@cmds);
print "\n$cmds[2] created";





Конвертируем PDF-документ в DJVU
Сконвертированные документы DJVU из PDF, как правило, имеют меньший размер и гораздо быстрее просматриваются, что особенно актуально для портативных устройств.

Для того, чтобы сконвертировать файл PDF в DjVu, требуется в текущем каталоге выполнить:
./pdfs2djvu
Это тоже скрипт на баше, код которого такой:

#!/bin/bash
#
# pdfs2djvu
#

if [ -z `which pdftoppm` -o -z `which cjb2` -o -z `which djvm` ]; then
echo
echo "Error: pdftoppm, cjb2 and djvm are needed"
echo
exit 1
fi

shopt -s extglob

OUTFILE="#0.djvu"
DEFMASK="*.pdf"
DPI=600

if [ -n "$1" ]; then
MASK=$1
else
MASK=$DEFMASK
fi

for PDF in $MASK; do
if [ ! -e $PDF ]; then
echo
echo "Error: current directory must contain files with the mask $MASK"
echo
exit 1
fi
echo $PDF
pdftoppm -mono -r 600 -aa yes $PDF $PDF
for PBM in $PDF*.pbm; do
echo $PBM
cjb2 -dpi $DPI $PBM $PBM.djvu
rm -f $PBM
done
done

djvm -c $OUTFILE $MASK*.pbm.djvu

Выполнение скрипта приведёт к тому, что все файлы PDF в текущей директории будут сконвертированы в DJVU. Аналогом является программа от Гугл под названием dpf2djvu.

Единственное условие: скрипт не переваривает кириллические названия с пробелами. Так что желательно временно переименовать файл так, чтобы он содержал только латинские символы и желательно без пробелов.

Ещё можно попробовать программу
gscan2pdf, которая позволяет сканировать изображения в форматы PDF и DJVU. Так же вам может пригодиться программа unpaper для «очистки» сканов. Это существенно улучшает их пригодность для последующего компьютерного использования.

Ссылки

Пост является волным пересказом этой замечательной статьи, тексты скриптов оттуда же. Так же можно прочесть вот это и это. Интересная подборка материалов на русском есть тут.
Читать далее

Установка и впечатления новой версии графического анализатора NIP2



7 коммент.
Не так давно вышла новая версия библиотеки обработки изображений VIPS, а вместе с ней и графическая оболочка nip2. Несколько слов о том, что изменилось и как новую версию быстро собрать и использовать.

Как уже говорилось тут, nip2 - это уникальный графический анализатор изображений любой разрядности и динамического диапазона. Новая версия nip2 за номером 7.14.1 стала ещё быстрее и появились новые возможности для анализа изображений.

Самые последние версии nip2 забираем отсюда из support-зоны, где самый свежак. Скачиваем vipsXXX.tar.gz и nip2XXX.tar.gz, при сборке последовательность такая же: сначала собираем VIPS и устанавливаем пакет, потом собираем nip2 и тоже устанавливаем. Последние версии (vips7.18.XX) могут не собраться, если Python старой версии - для этого указываем при сборке ключ --without-python и собираем.

Сборка и установка
Так как nip2 только вышел и вообще не так распространён, как например Gimp, придётся собрать пакет самостоятельно. Это нетрудно, однако могут потребоваться зависимости для того, чтобы nip2 работал на полную мощность.

Сначала собираем VIPS, для чего распаковываем в каталог vips-7.14.1 скачанный архив, и от рута даём команду:
dh_make --createorig
Далее пишем
debuild
VIPS должен собраться без вопросов. Полученный пакет устанавливаем
dpkg -i vips_7.14.1-1_i386.deb
После этого собираем сам nip2. Очерёдность важна, так как при сборке nip2 потребуются файлы из VIPS, на которой графический анализатор и основан. Кроме того, на этапе сборке могут произойти ошибки - чаще всего из-за отсутствия необходимых пакетов:

checking for PKGFLAGS... configure: error: Package requirements (gthread-2.0 gtk+-2.0 >= 2.4.9 libxml-2.0 vips-7.14) were not met:
No package 'gtk+-2.0' found
No package 'vips-7.14' found
Собственно, ставим эти пакеты.
aptitude install libgtk2.0-0 libgtk2.0-common libgtk2.0-bin libgtk2.0-dev
Так же могут потребоваться следующие пакеты:
aptitude install fftw3 fftw3-dev libxml2 libxml2-dev libxml++2 gsl-bin libgsl0-dev libxml++1.0-dev libxml++1.0c2a libtiff4 libtiff4-dev flex
Последний пакет, flex, я поставил только тогда, когда сборка вываливалась с ошибкой на файле parce.c и я не мог понять из-за чего. Конечно, в файле README было сказано, что он нужен, но кто ж его читать-то будет!? :-)

Итак, сборка должна успешно завершиться и собранный пакет ставим dpkg. Конечно, автора можно упрекнуть за такую "наколеночную" сборку пакетов, однако надо быстренько получить новую версию нужной утилиты, а не кружавчики вышивать.


Изменения в Nip2
Расширился состав фильтров, теперь в официально включён шумоподавляющий фильтр GREYstoration, ряды можно именовать по своему усмотрению, расширены функции программирования. А главное - Nip2 стал ощутимо быстрее предыдущей версии, так что если вы им часто пользуетесь, то есть смысл обновиться.

Фильтры
В составе Nip2 теперь улучшенные фильтры морфологического анализа (пока только бинарная морфология), многие фильтры получили возможность точной настройки (custom kernels), а так же включён шумоподавляющий фильтр GREYstoration, основанный на анизотропной диффузии. GREYstoration интересен тем, что реализует подавление шума при помощи весьма изощрённого "сглаживания" изображения. В результате это важные детали не размываются, а шума становится намного меньше. Техника anisotropic diffusion известна довольно давно, однако реализация в Nip2 достаточно быстрая и нетребовательная к памяти, что важно при работе с большими изображениями.
Пример приведён на этом скриншоте:

Справа сверху - оригинальное изображение, справа снизу - с подавленными шумами. Очаровательная девушка на фотографии - Лена Содерберг, о которой я уже писал.


Именование рядов
Это полезная функция, если требуется анализировать много изображений. Тогда можно задать один workspace и просто заменять одно изображение - остальное пересчитается автоматически. Именованные ряды позволяют проще отличать конечные результаты анализа от промежуточных подсчётов.
Просто впишите в пустую клетку:

Mean=Math_stats_item.Mean_item.action A1
и вы получите именованную ячейку, содержимое которой есть среднее значение изображения в ячейке А1. Именовать по-русски пока нельзя, только на английском.


Горячие клавиши на элементы меню
Очень и очень полезная возможность! Открываем меню, доходим до нужной нам функции, подсвечиваем её и наживаем к примеру CTRL+M - и теперь на функцию повешена горячая кнопка. Теперь, чтобы посчитать среднее значение на изображении, просто выделяем изображение и нажимаем CTRL+M.


Заключение
В общем и целом, релиз удался: nip2 стал ещё быстрее и получил новые фильтры и методы анализа изображений.
Читать далее

Цифровые камеры Canon EOS 400D и 40D - так ли они отличаются?



22 коммент.
Не так давно вышла новая цифровая камера от Canon - Canon EOS 40D. Было анонсировано, кроме прочего, наличие 14-битного АЦП. Думаю, что многие загорелись возможностью купить такую цифровую камеру и использовать её для измерительных целей: такая же техническая камера стоит раз в 30 дороже. Однако позже выяснилось горькая правда - внутри установлена та же самая матрица и, есть обоснованные подозрения, что и сходное АЦП. В переводе на русский это означает, что дополнительные биты вы получите ценой усиления шума, что сводит на нет всю прелесть 14-битного АЦП.

Полученные данные позволяют утверждать, что в цифровых камерах Canon EOS 400D и 40D установлены фотосенсоры одной и той же модели. Более того, возможно, что к АЦП на камере 40D двухступенчатый, на что указывает график зависимости стандартного отклонения темнового шума от значения ISO. Многие параметры фотосенсора, например, BLO (Black Level Offset), стандартное отклонение шума, величина сигнала при насыщении, особенности зависимости сигнала от шума при некоторых значениях освещённости говорят о том, что в 40D и 400D установлены идентичные фотосенсоры. На это же намекают в whitepaper на камеру 40D:
Although the EOS 40D’s single-piece CMOS sensor is based on the Canon EOS Digital Rebel XTi’s sensor design and manufacturing technology, new processes were incorporated in the CMOS semiconductor fabrication and microlens-forming process.
Курсивом отмечены золотые слова: КМОП-сенсор 40D основан на дизайне и производственной схеме 400D (он же Digital Rebel), а что они там нахимичили в микролинзах - это дело десятое.

А это значит, что преимущество 14-битного АЦП в таком случае нивелируется возросшим уровнем шумов и, как следствие, уменьшением величины отношения ``сигнал/шум'' при том же динамическом диапазоне.


Экспериментальные данные
Из рисунков Рис.9а) и б) можно видеть, что среднее значение темнового шума увеличивается с ISO очень медленно, однако величина постоянного темнового шума
отличается в 4 раза. Это можно объяснить увеличением разрядности АЦП
при том же фотосенсоре.

Более того, анализируя графики зависимости стандартного отклонения темнового шума от ISO (рис.1) можно сделать вывод, что скорее всего АЦП на Canon 40D двухступенчатый.
Это объясняет характерные провалы СКО шума на промежуточных значениях
ISO, однако если соединить точки 100, 200, 400, 800 и 1600, то
получится гладкая кривая, значения которой опять-таки примерно в 4 раза
отличаются от тех, которые имеют место быть на Canon 400D.


а)
б)

Рис.1: Изменение среднего значения темнового шума
от величины ISO: а) для Canon 400D, б) для Canon 40D.

Таким образом, величина BLO на двух фотокамерах совпадают с точностью до постоянного множителя. Так же любопытно сравнение значений стандартного отклонения от шума для двух цифровых камер, которое приводится на рис.2.

а)
б)
Рис.2: Изменение стандартного отклонения темнового шума
от ISO: а) для Canon 400D, б) для Canon 40D.

Видно, что в точках 100, 200, 400, 800 и 1600 соответственно стандартное отклонение темнового шума отличается так же почти в 4 раза - это свидетельствует о том, что АЦП установлены со сходными характеристиками.

Более того, на зависимости сигнала от шума имеется аномальное отклонение для данных, полученных с Canon EOS 400D - наблюдающийся провал на зависимости, приведённой на рис. 3 воспроизводится даже при некотором изменении параметров эксперимента.

а)
б)

Рис.3: Зависимость сигнала от шума для данных, обработанных
DCRAW в документальном режиме (данные приведены для красного канала):
а) для Canon 400D, б) для Canon 40D.

На рис.3 приведены данные по световым шумам фотосенсоров Canon 400D и 40D в
красном канале. Видно, что в обоих случаях имеется аномальное поведение зависимости сигнала от шума - и эта аномалия одна и та же для двух рассматриваемых камер. Это однозначно указывает на то, что фирма Canon установила ту же самую матрицу в модель 40D, которая устанавливалась и в 400D. А это в свою очередь означает, что 14-битный АЦП ничего не даёт в плане увеличения динамического диапазона камеры, если её рассматривать в качестве измерительной.

Так, для 12-битной камеры Canon EOS 400D были получены следующие характеристики:
  • Предельное значение сигнала: 3726 DN.
  • Оптический динамический диапазон (ODR): 59 dB.
  • Линейный динамический диапазон (LDR): 58 dB.
  • Максимальный "сигнал/шум": 117 (6.9 bit).
  • Стандартное отклонение темнового шума: 1.6 DN.
В то же время, для 14-битной камеры Canon EOS 40D измерительные характеристики хуже:
  • Предельное значение сигнала: 13825 DN.
  • Оптический динамический диапазон (ODR): 56 dB.
  • Линейный динамический диапазон (LDR): 52 dB.
  • Максимальный "сигнал/шум": 75 (6.2 bit).
  • Стандартное отклонение темнового шума: 6.0 DN.
Во всех случаях минимальный сигнал\шум принимался равным 2.

Выводы:
Если вы используете цифровые зеркальные фотокамеры в качестве измерительных приборов, то выбор в этом качестве Canon EOS 40D не оправдан из-за меньшего значения линейного динамического диапазона и более высокой стоимости.
Читать далее

Cinepaint - простой и быстрый графический редактор



7 коммент.
Есть ряд специфических задач при обработке фотографий в Линукс, таких как HDR-фотографии и обработка изображений с высокой битностью. Это позволяет сделать - и очень быстро - графический редактор Cinepaint. Простой, быстрый и в меру функциональный.


Как говорится на официальном сайте проекта, Cinepaint ориентирован прежде всего на редактирование изображений для фильмов и анимации. И в этой области Cinepaint действительного многого достиг: полная поддержка форматов CIN, DPX и EXR, а так же поддержка разрядности изображения 8, 16 и 32 бита.


Интерфейс

Тяжёлое наследие гимпа в интерфейсе - куча окошек и без табового менеджера окон обойтись трудно.



Есть инструменты рисования, кадрирования и работа со слоями, и если вы боролись с интерфейсом GiMP, то здесь вы почувствуете себя уверенно.


Работа в Cinepaint
В ряде случаев Cinepaint быстрее GiMP, и в нём можно редактировать 16-битные изображения, получаемые с современных цифровых фотокамер при помощи RAW-конверторов, например UFRaw и dcraw.

Цвета - только оттенки серого или RGB. Для видеоредактора особенно большего и не надо. Зато разрядность цвета 8, 16 и 32 бита. Есть возможность работы с цветопередачей - имеется возможность применения ICC-профилей. Кроме того, обычные инструменты типа "Кривые", "Уровни" и коррекция оттенков.

Интересная возможность визуальной цветокоррекции в меню Image - Colors - Color correction.



Это позволяет быстро оценивать и менять направление цветокоррекции.


Интересная возможность Cinepaint

У Cinepaint есть уникальная возможность - автоматическое создание HDR-изображений по нескольким снимкам. Здесь дано подробное руководство со ссылками на весьма авторитетных исследователей в этой области.
Неприятность в том, что когда вы снимаете тропический рассвет на фоне моря и леса, вы попадаете в сложную ситуацию. Если рассчитывать экспозицию относительно неба, то оно на снимке будет проработано хорошо, но лес будет чёрным пятном (проработается слабо). Если же брать экспозицию по тёмным участкам, то проработаются они, а небо будет "выбито". Решение есть, и оно в общем простое: сделать несколько снимков с "недодержкой" (по теням), обычное и с "передержкой" (по светлой части). На каждом снимке получаете детали из каждой области - комбинируя три (или больше) изображения, получаете свой тропический рассвет на фоне отлично проработанного леса.

Это довольно кропотливое занятие сильно облегчает Cinepaint: в нём уже есть модуль, который рассчитывает, откуда взять участки изображений для получения изображения с высоким динамическим диапазоном.
На самом деле, зная порог насыщения своей камеры и приблизительно ориентируясь на встроенный экспонометр, можно всё сделать и за один кадр - динамического диапазона у камеры с лихвой для этого хватит (как правило, это около 11 бит, или около 50dB). Но это потребует применения совсем иных средств обработки, таких как nip2, MATLAB/Octave и dcraw со специальными ключами.
В общем, Cinepaint - это ещё один инструмент в арсенале фотографов и любителей работы с растровыми изображениями. Не без недостатков и со своими преимуществами.


Выводы
Как метко говорят мои заокеанские коллеги-блоггеры, "Cinepaint needs some serious love" :-) Для графического редактора в 2007 году gtk-1 это даже не смешно, а очень грустно. Но это не единственный недостаток:
  1. очень, очень мало фильтров обработки изображений;
  2. те, что есть, в большинстве своём не интерактивны (нет возможности предпросмотра) и бедны настройками;
  3. алгоритмов шумоподавления в комплекте нет вовсе;
Есть и плюсы:
  1. То, что есть, как правило весьма быстро работает :-)
  2. возможность работы с 8, 16 и 32-битным цветом;
  3. возможность работы с цветовыми профилями;
  4. уникальные возможности по работе и созданию HDR-изображений;
В общем, не гимпом единым, как говорится. Быстрый, в меру функциональный графический редактор, много места не занимает. Достойный помощник GiMP там, где это требуется.
Читать далее

Экспозиция более 30 секунд на цифровой камере: Long-time remote shooting



12 коммент.
Задача: требуется фотографировать с выдержками более 30 секунд ("от руки") и есть необходимость этот процесс автоматизировать.
Решение: при помощи паяльника, доступных электрических компонентов и скрипта на bash можно снимать с длительными выдержками без необходимости стоять с камерой и держать кнопку.


Исходные данные
Имеется цифровая фотокамера Canon EOS 400D, Debian-powered ноутбук и необходимость снимать фотографии с выдержкой более 30 секунд. Если немного погуглить, то можно найти замечательную схему, которую предлагает Michael A. Covington здесь. На всякий случай дублирую её тут:



Схема прекрасная, но она подходит для Canon EOS 300D, а для 400D нет - если её спаять и попробовать управлять 400D, то затвор будет только подниматься, но не опускаться. То есть нет возможности остановить экспозицию в нужный момент, кроме как выключить камеру.


Схема для Canon EOS 400D
Долго ли, коротко, однако я с коллегой, Алексеем Ропяным, экспериментальным путём выяснили, что закрывает затвор фотоаппарат по сигналу с другого контакта, и Алексей предложил схему изменить вот так:



И это сработало: наш лабораторный Canon EOS 400D стал открывать и закрывать затвор по команде с компьютера!


Необходимые компоненты
Для того, чтобы спаять шнурок управления камерой, требуется некоторое количество четырёхжильного кабеля (от аудиоаппаратуры или простой телефонный провод), jack на 2.5мм (он же 3/32 inch), указанные на схеме радиоэлементы (можно купить в Chip&Dip), 9-контактный COM-порт и соответственно переходник USB-COM (чтобы можно было использовать и на современных компьютерах, и на старых), а так же паяльник и немного терпения.

Переходник USB-COM лучше всего брать на чипе Profilic 2303 - это самый распространённый чип и в Линукс работает "из коробки".


Программное обеспечение
Для управления камерой требуется одна маленькая утилита, которую мне подсказали на Астрофоруме (обсуждение велось в теме "Выдержка более 30 сек. через комп?" тут и "Чем Linux полезен ЛА?" здесь).

Программа называется setSerialSignal и её исходник находится здесь. Скомпилировать её GCC, который входит в любой дистрибутив *nix-систем:
gcc -o setSerialSignal setSerialSignal.c
Проверялось на системе Debian GNU/Linux v4.0 r.0 "Etch", gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21).

На всякий случай дублирую исходный код программы:

/*
* setSerialSignal v0.1 9/13/01
* www.embeddedlinuxinterfacing.com
*
*
* The original location of this source is
* http://www.embeddedlinuxinterfacing.com/chapters/06/setSerialSignal.c
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* setSerialSignal
* setSerialSignal sets the DTR and RTS serial port control signals.
* This program queries the serial port status then sets or clears
* the DTR or RTS bits based on user supplied command line setting.
*
* setSerialSignal clears the HUPCL bit. With the HUPCL bit set,
* when you close the serial port, the Linux serial port driver
* will drop DTR (assertion level 1, negative RS-232 voltage). By
* clearing the HUPCL bit, the serial port driver leaves the
* assertion level of DTR alone when the port is closed.
*/

/*
gcc -o setSerialSignal setSerialSignal.c
*/


#include
#include
#include

/* we need a termios structure to clear the HUPCL bit */
struct termios tio;

int main(int argc, char *argv[])
{
int fd;
int status;

if (argc != 4)
{
printf("Usage: setSerialSignal port DTR RTS\n");
printf("Usage: setSerialSignal /dev/ttyS0|/dev/ttyS1 0|1 0|1\n");
exit( 1 );
}

if ((fd = open(argv[1],O_RDWR)) < 0)
{
printf("Couldn't open %s\n",argv[1]);
exit(1);
}
tcgetattr(fd, &tio); /* get the termio information */
tio.c_cflag &= ~HUPCL; /* clear the HUPCL bit */
tcsetattr(fd, TCSANOW, &tio); /* set the termio information */

ioctl(fd, TIOCMGET, &status); /* get the serial port status */

if ( argv[2][0] == '1' ) /* set the DTR line */
status &= ~TIOCM_DTR;
else
status |= TIOCM_DTR;

if ( argv[3][0] == '1' ) /* set the RTS line */
status &= ~TIOCM_RTS;
else
status |= TIOCM_RTS;

ioctl(fd, TIOCMSET, &status); /* set the serial port status */

close(fd); /* close the device file */
}



Посылаемые сигналы
Программу собираем и даём ей необходимые права на выполнение, а ниже - сигналы, посылаемые в порт программой, и их передача setSetialSignal:

Сигнал DTR
setSerialSignal /dev/ttyS0 1 0



Сброс сигнала DTR
setSerialSignal /dev/ttyS0 0 0


Сигнал RTS
setSerialSignal /dev/ttyS0 0 1


Сброс сигнала RTS
setSerialSignal /dev/ttyS0 1 1


Всё это обеспечивает вам возможность управления камерой: открытие происходит по сигналу DTR, закрытие - сигналу RTS.


Скрипт управления камерой
Дальше удобно воспользоваться простым скриптом, который написал Евгений Ромас aka BrainBug, но для случая с 400D я скрипт немного поправил, и теперь он выглядит так:

#!/bin/bash

for i in `seq $3`; do
{
setSerialSignal /dev/ttyUSB0 0 0 &&
sleep $1 && setSerialSignal /dev/ttyUSB0 0 1 &&
sleep 0.3 && setSerialSignal /dev/ttyUSB0 0 0 &&
sleep $2 && setSerialSignal /dev/ttyUSB0 1 1 && echo "One more image captured!" &&
sleep $4;

}
done

echo "Done!"

Параметры скрипта:
1: задержка поднятия зеркала
2: время выдержки в секундах
3: количество кадров
4: задержка между кадрами

Пример:
make_captures 4 60 30 2

Скрипт расчитан на работу с переходником USB-COM, и если у вас другой номер порта - естественно, скрипт нужно немного поправить.


Как это работает
Итак, шнурок спаян, переходник USB-COM включён в USB или сам шнурок вставлен в COM-порт, софт скомпилирован и наделён необходимыми правами. Изложение ориентировано на любую *nix-систему, в данном случае это Debian GNU/Linux.
  • Включаем камеру, переводим её в режим BULB, выставляем значение диафрагмы и ISO, а так же другие параметры при необходимости.
  • Вставляем jack в разъём фотокамеры, а противоположный конец в COM-порт или COM-USB переходник и далее в USB-порт компьютера.
  • Убеждаемся (в случае USB), что переходник опознан и работает: dmesg должен выдать что-то вроде:
usb 2-1: new full speed USB device using uhci_hcd and address 2
usb 2-1: configuration #1 chosen from 1 choice
drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303
pl2303 2-1:1.0: pl2303 converter detected
usb 2-1: pl2303 converter now attached to ttyUSB0
usbcore: registered new interface driver pl2303
drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driver
  • Всё готово, теперь снимаем при помощи команды:
    make_capture 1 5 2 3
В этом примере будет сделано 2 кадра с экспозицией 5 секунд, задержка между кадрами 3 секунды, задержка поднятия зеркала 1 секунда.
Следует так же отметить, что таким способом можно отсекать выдержки от 1 секунды и больше по Exif. Физически передавать сигнал можно и быстрее, однако в Exif при этом пишутся неправильные данные. Точно так же, выдержки в данном случае отсекаются с точностью 1 секунда. Впрочем, для установки, которая должна отсекать длинные выдержки, это приемлемо.

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

Работает на камерах по крайней мере с firmware 1.0.4, имеются частные сообщения, что оригинальная схема должна работать с 400D. Выясняется в настоящее время.

Благодарности
Эта статья появилась в результате усилий многих людей, которых мне хотелось бы поблагодарить за помощь:
  • Michael A. Covington for his original article "Building a Cable Release and Serial-Port Cable for the Canon EOS 300D Digital Rebel".
  • Евгению Ромасу aka BrainBug за ссылку на оригинальную статью по управлению фотоаппаратом при помощи COM-порта, а так же за ценные мысли, высказанные в частных сообщениях.
  • Антону aka NTRNO за то, что выискал ключевые посты в недрах Астрофорума и выдал идеи по управлению камерой в Linux.
  • Всем участникам Астрофорума, так или иначе участвовавших в темах управления фотокамерой при помощи компьютера.
  • Алексею Ропяному, который экспериментально выяснил особенность фотокамеры, предложил изменить схему и использовать сигнал DTR для закрывания затвора.
  • Леониду Серёжкину за реализацию схемы в железе.
А так же огромная благодарность сотрудникам кафедры Физики твёрдого тела №25 МИФИ за поддержку и понимание.
Читать далее