kouprianov: (Default)
2018-03-03 09:41 pm

По следам Мановича с ImageMagick, perl и R наперевес

В последние годы в кругах, причастных цифровой гуманиоре, популярны работы Льва Мановича [см. http://manovich.net/ ], придумавшего и пропагандирующего интересные формы работы с большими массивами изображений. Обычно, как я понял, он получает эти массивы по API из Instagram или аналогичных источников, потом создает базы изображений и сопутствующих метаданных и строит умопомрачительной красоты визуализации.

Часто говорят о том, что он работает с изображениями в «нередуцированном» виде. Из чтения его работ я не понял, что имеется в виду под нередуцированным видом, потому что вся умопомрачительная графика строится на том, что из графического файла извлекаются весьма немногие суммарные характеристики (обычно усредненная яркость, контрастность и время создания), после чего вся коллекция располагается в осях этих переменных. Отдельные изображения, в зависимости от размеров графика и количества изображений, могут репрезентировать точки, покрашенные в усредненный по изображению цвет, или уменьшенные / неуменьшенные копии изображений, играющие роль все тех же точек на графике, но краше.

Сам Манович предлагает использовать для работы специально созданный им программный продукт, который состоит из надстройки над Jimage. Немного подумав, я решил, что нет ничего запредельно сложного, в том, чтобы добиться того же иными средствами, не отходя далеко от R (в работе с R я вижу два плюса -- возможность создания скриптов, позволяющих воспроизводить преобразования данных, расчеты и графики, и бесконечный аналитический потенциал). При такой простоте подхода к презентации данных, ключевой вопрос был, как понятно, в том, чтобы как-то получить эти самые данные об изображениях (потому что, получив их, нарисовать типичный график несложно). Я не рассматриваю здесь вопрос о сборе метаданных (авторы, комментарии, геопозиция, количество лайков и т. п.) и получении изображений как таковых. Они лежат в несколько иной плоскости (роботы-фетчеры и API), меня интересуют вопросы об анализу уже наличных коллекций.

Если изображения уже имеются в вашем распоряжении, добыть данные об их параметрах гораздо проще, чем может показаться на первый взгляд. Помимо GUI редакторов для графики, как известно, есть довольно мощные инструменты для работы с графикой из командной строки. Я использую в таких случаях ImageMagick (да нагуглится имя его). В его состав, среди многого прочего, входит утилита identify, которая возвращает от просмотренных ею файлов довольно изрядный список параметров. Если не указано иное, то возвращает она его на стандартное устройство вывода (экран), но можно указать иное и направить весь этот поток текста в файл. Вот несколько сокращенный real-life пример данных по одному из моих файлов (фото, сделанное цифровым фотоаппаратом).

Пример под cut... )

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

Файл imagedata.sh:

#!/bin/bash
shopt -s globstar
for img in **/*.JPG; do identify "$img" -verbose >> imagedata.raw.txt
done

Скрипт жужжал больше часу, собрал 60+ МБ всей этой словесно-цифирной шелухи из 7+ тыс. файлов (скромно, в общем, но я мало снимаю в последние годы). Пришла пора достать оттуда то, что нужно (умные люди могут делать это на лету, думаю, и я, попыхтев немного с sed, смог бы, но пыхтеть не хотелось и я пошел по пути наименьшего сопротивления, написав [опять-таки, по мнению знатоков, наверняка избыточный] скрипт на perl). Доставать я собирался время создания, параметры каналов RGB (mean и standard deviation) и суммарные характеристики изображения, которые могут сойти за меры общей яркости и общей контрастности Overall / mean и Overall / standard deviation.

скрипт тоже под cut... )

После чего у меня образовался небольшой файлик на 1.2 МБ, который уже можно было загружать в R. После загрузки удалось нарисовать несколько картинок примерно настолько же осмысленных, как и картинки автора идеи. Самая большая возня была, как это ни смешно, с осью времени (я редко работаю со временем в таком формате), но все как-то утряслось. Их можно допиливать и дальше (например, теоретически возможен вариант с использованием сильно уменьшенных изображений в качестве точек на графиках), но это уже не принципиально.

Вот -- коллекция, развернутая в осях: яркость / контрастность:

scatter.man

Вот, в порядке нарастания детализации, временные ленты для яркости...:

band.man.20110701_20171231.mean
band.man.20120715_20120731.mean
band.man.20120726.mean

...и контрастности:

band.man.20110701_20171231.sd
band.man.20120715_20120731.sd
band.man.20120726.sd
kouprianov: (Default)
2018-01-17 07:03 pm
Entry tags:

ПRодиRаясь сквозь гRафику... - 2

В продолжение старой истории про светло-серый белый. Разбираясь с аналогичным случаем в этот раз (возможно, связано с особенностями отображения и вывода на печать CMYK-изображений), набрел на кусок imagemagick, отвечающий за просмотр цветовой модели. Если нужна только она, то:
identify -format '%[colorspace]' image.tiff

Для множества файлов оно тоже работает, но чтобы вывод было проще смотреть в столбик, требуется добавить \n:
identify -format '%[colorspace]\n' *.tiff

Аналогичный результат можно получить и так:
identify -verbose image.tiff | grep Colorspace

Да в целом по identify -verbose image.tiff можно увидеть массу интересного.
kouprianov: (Default)
2017-10-19 12:07 am
Entry tags:

Заменить прозрачный фон на белый, конвертировать PNG в TIFF без сжатия и RGB в CMYK

Не успел я опечалиться, что GIMP не умеет делать цветоделение в CMYK (во всяком случае, я этого быстро не нашел), как я вспомнил, что все проблемы, наверное, могут быть решены при помощи imagemagick. Некоторое время гугления, и я нашел все, что мне нужно. Удалось (1) заменить прозрачный фон белым, (2) конвертировать из PNG в несжатый TIFF, (3) перекодировать цвета в CMYK (в моем случае с профилями колдовать было не надо).

convert source.png -background white -flatten target.png
convert source.png -compress None target.tiff
convert source.RGB.tiff -colorspace CMYK target.CMYK.tiff
kouprianov: (Default)
2015-03-03 10:23 pm

Linux и multimedia, что я поневоле узнал про них за последние дни

1. Лучшим проигрывателем видео признан mplayer (его пришлось sudo apt-get install), он почему-то не был предустановлен.

2. В воскресенье, собираясь утром на марш и олимпиаду я по рассеянности установил на фотоаппарате 1 марта 2014 года, а поскольку в какой-то момент там было выставлено принудительное проставление timestamp, то все кадры оказались помечены датой годичной давности. Внезапно выяснил, что все это, в общем, поправимо, и вот каким способом.

Способ в три этажа... )

UPD: ссылка по теме: http://www.imagemagick.org/Usage/

kouprianov: (Default)
2015-01-30 11:30 pm

ПRодиRаясь сквозь гRафику...

Вздумалось мне тут положить один нарисованный в R график на другой. Нет, я потом, конечно, сделал все через par(new=T), как подобает настоящему самураю, но поначалу мне показалось, что совместить два готовых PNG изображения в GIMP будет быстрее. Не тут-то было. Сделав это, я тут же обнаружил, что меньший по размеру график нарисован на светло-сером фоне, который хорошо заметен на белом фоне большего по размерам графика. Первая мысль была, конечно, о том, что надо принудительно указать белый цвет фона через par(..., bg="white"). Безрезультатно. Фон остался серым. Вторая -- о том, что можно сделать фон не белым, а прозрачным при помощи par(..., bg="transparent") (паника: за несколько лет успел забыть, как сделать прозрачность в GIMP). Никакого толку. Фон, возможно, стал прозрачным, но вместе с ним прозрачными стали и черные линии, причем они стали бледно серыми до почти полной невидимости. Зашел в тупик, отправился гуглить.

По результатам гугления поставил imagemagick (почему-то его по умолчанию не стояло), после чего все оказалось элементарно. Написал в командной строке:

convert filename.png -transparent white filename.png

Получил на выходе файл с идеально прозрачным фоном и черными линиями на оном. Положил его в GIMP на основной график, все срослось.

Подсказку про imagemagick нашел тут: http://stackoverflow.com/questions/25354479/opaque-legend-in-an-r-plot-with-transparent-background

Но через par(new=T), разумеется, проще...