УДК 004.9
Работа с файлами ICC-профилей в среде MATLAB
А.А. Чертихин, М.О. Гущина
Московский государственный университет печати имени Ивана Федорова 127550, Москва, ул. Прянишникова, 2А e-mail: [email protected], [email protected]
В связи с широким распространением средств вычислительной техники, которая тем или иным образом отвечает за воспроизведение изобразительной информации, активное развитие получили системы управления цветом (Color Management Systems - CMS). Основной целью подобных систем является автоматизация и контроль цвета на различных этапах воспроизведения и согласование цветопередачи на различных устройствах. Основная идея, заложенная в данной концепции, лежит в выявлении особенностей устройства ввода/вывода изобразительной информации и воспроизведении нужного изображения с учетом выявленных характеристик.
Предпосылки. При воспроизведении одного и того же изображения на мониторах разных моделей или даже с различным временем эксплуатации, восприятие наблюдаемого результата может быть различным. Данный факт относится ко всем устройствам, которые так или иначе взаимодействуют с изобразительной информацией. Устройства ввода/вывода воспроизводят цвета в аппаратно-зависимых пространствах (RGB, CMYK). Например, при вводе изображения через сканер произвольная точка имела следующие цветовые координаты: R = 33 G = 39 B = 106; после сканирования на LCD-монитор будет выведено изображение уже с координатами точки R = 49 G = 40 B = 152. Данные цвета будут восприниматься одинаково, но их математическое описание различно. Окружение и фон так же оказывают влияние на восприятие изображения и должны учитываться при его воспроизведении.
Для воспроизведения оригинала на различных устройствах вывода с психологической точностью (классификация Н.Д. Нюберга),
168
Международным консорциумом по цвету (International Color Consortium -ICC) была разработана архитектура систем управления цветом CMS и введена спецификация формата цветового профиля, в которой учитываются факторы, влияющие на восприятие.
Основные идеи ICC-профилирования. Концепция ICC предполагает, что файл профиля содержит всю основную информацию об устройстве и условиях просмотра, которая оказывает влияние на восприятие изображения. Это такие данные, как класс устройства, метод цветосинтеза, цветности излучателей/красителей, источник света при рассматривании изображения и т.д. Спецификация цветового профиля определяет не только данные, необходимые при цветовоспроизведении, но и набор алгоритмов, которые использует CMS. CMS реализуется в виде программного модуля, инсталлируемого на уровне операционной системы. Основная идея состоит в преобразовании координат из аппаратно-зависимого цветового пространства в аппаратно-независимое, в котором выполняются основные алгоритмы синтеза с учетом особенностей устройства ввода/вывода, и дальнейшем их преобразовании в координаты цветового пространства требуемого устройства. Таким образом, у каждого устройства должен быть свой файл ICC-профиля.
Сам файл состоит из:
• заголовка профайла (128 байт) - Header;
• таблицы тегов - TagTable: число тегов (4 байта);
• теги (12 байт на каждый);
• внутритеговые данные (вариабельный размер).
MATLAB и файлы ICC-профилей. MATLAB - набор взаимосвязанных модулей и одноименный язык программирования. Начиная с 7-й версии программы, в нее были включены средства для работы с ICC-профайлами, что упрощает чтение и запись файлов. Были добавлены следующие основные функции: iccroot, iccread, iccwrite, isicc, iccfind. Далее представлено описание функций и примеры их работы.
Поиск директории для файлов ICC-профилей по умолчанию
iccroot
rootDirectory = iccroot
Функция возвращает строку (rootDirectory), которая является путем к корневому каталогу с файлами ICC-профилей, хранящихся на данном компьютере. Пример работы данной функции представлен в листинге 1.
Листинг 1
>> rootDirectory = iccroot;
>> rootDirectory rootDirectory =
C:\Windows\System32\Spool\Drivers\Color
169
Чтение файла ICC-профиля (iccread) sturcureProfile = iccread(fileName)
Входным параметром функции является строка с наименованием файла (fileName), включая расширение. Данный файл может иметь любое расширение ICC-профайла или TIFF, содержащий ICC-профиль. Функция ищет данный файл в каталоге «C:\Windows\System32\ Spool\Drivers\Color» для Windows или «/Library/ColorSync/Profiles/ Displays» для Mac OS, либо в каталоге, который задается с помощью функции iccroot. Возвращаемым значением (sturcureProfile) является структура данных, поля которой содержат теги и их значения файла ICC-профиля. Данная функция способна прочитать данные 2 (ICC.1: 200104) и 4 (ICC.1: 2001-12) спецификаций ICC. Количество полей и их организация зависит от класса файла ICC-профиля.
В листинге 2 представлен пример работы данной функции для файла ICC-профиля «GoldBlue.icc». Из примера видно, что данные структурированы и обращение к нужным полям или тегам не вызывает затруднений, что является большим преимуществом при изучении структуры того или иного файла.
Листинг 2
>> structureGoldBlue = iccread('GoldBlue.icc');
>> structureGoldBlue structureGoldBlue =
Header: [1x1 struct]
TagTable: {4x3 cell}
Description: [1x1 struct]
Copyright: 'Copyright 2011 Adobe Systems Inc.' MediaWhitePoint: [0.9642 1 0.8249]
AToB0: [1x1 struct]
PrivateTags: {}
Filename:
'C:\Windows\System32\Spool\Drivers\Color\GoldBlue.icc' >> structureGoldBlue.AToB0 ans =
MFT: 1
PreShaper: []
PostMatrix: []
PostShaper: []
PreMatrix: [3x4 double]
InputTables: {[256x1 uint8] [256x1 uint8] [256x1 uint8]}
CLUT: [4-D uint8]
OutputTables: {[256x1 uint8] [256x1 uint8] [256x1 uint8]}
170
Стоит заметить, что форма описания файлов несколько отличается от самой структуры файлов ICC-профилей. Архитектура structureGoldBlue для файла GoldBlue.icc не совпадает с архитектурой самого файла. Например, тег AToBO, информация о котором расположена в таблице тегов, а данные в разделе внутритеговых данных (для GoldBlue.icc) здесь находится, можно сказать, на поверхности. Это в какой-то степени облегчает обращение с тегами файла, в силу того, что данные этого тега можно назвать важными для данного класса профайлов.
Запись файла ICC-профиля iccwrite sturcureProfileNew = iccwrite(sturcureProfile, fileName)
Входными параметрами функции являются структура файла ICC-профиля (sturcureProfile), которая должна иметь архитектуру аналогичную, возвращаемую функцией iccread, и имя нового файла ICC-профиля (fileName), передаваемого в виде строки. Функция возвращает структуру нового профайла. Стоит учесть, что при записи нового профайла функция может несколько модифицировать данные, чтобы сохранить совместимость с ICC спецификацией. Так, например, в структуре могут отсутствовать некоторые обязательные теги заголовка, которые не влияют на результат репродуцирования оригинала изображения с использованием данного файла ICC-профиля (дата создания и т.д.).
Пример работы данной функции представлен в листинге 3.
Листинг 3
>> sturcureProfile = iccread('GoldCrimson.icc');
>> sturcureProfile sturcureProfile =
Header: [1x1 struct]
TagTable: {4x3 cell}
Description: [1x1 struct]
Copyright: 'Copyright 2011 Adobe Systems Inc.' MediaWhitePoint: [0.9642 1 0.8249]
AToBO: [1x1 struct]
PrivateTags: {}
Filename:
'C:\Windows\System32\Spool\Drivers\Color\GoldCrimson.icc' >> sturcureProfile.Description ans =
String: 'Gold-Crimson'
Optional: [1x79 uint8]
>> sturcureProfile.Description.String = 'new description for test'; >> sturcureProfileNew = iccwrite(sturcureProfile, 'ICC-profileNew.icc');
171
>> sturcureProfileNew sturcureProfileNew =
Header: [1x1 struct]
TagTable: {4x3 cell}
Description: [1x1 struct]
Copyright: 'Copyright 2011 Adobe Systems Inc.' MediaWhitePoint: [0.9642 1 0.8249]
AToB0: [1x1 struct]
PrivateTags: {}
Filename: 'ICC-profileNew.icc'
Важным параметром, который должен быть уникальным для каждого профайла, является строка описания ICC-профиля (sturcureProfile.Description.String). Поэтому в представленном примере при создании нового файла ICC-профиля необходимо задать новое значение для этого поля.
Проверка файла ICC-профиля на валидность isicc result = isicc(structureProfile)
Входным параметром функции является структура файла ICC-профиля (structureProfile), которая должна иметь архитектуру аналогичную, возвращаемую функцией iccread. Функция возвращает true (1), если structureProfile имеет структуру файла ICC-профиля, в противном случае - false (0). Функция проверяет наличие обязательных тегов соответственно спецификации ICC 2 (ICC.1: 2001-04) и 4 (ICC.1: 2001-12) версий. Пример работы функции представлен в листинге 4.
Листинг 4
>> structureProfile = iccread('sRGB.icm');
>> result = isicc(structureProfile);
>> result result =
1
>> file = textread('word.txt','%s');
>> result = isicc(file);
>> result result =
0
Поиск файлов ICC-профилей iccfind
У данной функции есть несколько вариантов использования. Три из них представлены ниже.
profiles = iccfind(rootDirectory)
172
Функция принимает строку (rootDirectory), которая является путем к корневому каталогу с файлами ICC-профилей, хранящихся на данном компьютере. Возвращаемым значением является массив, который хранит структуры данных о все файлах ICC-профилей в указанной директории.
[profiles, descriptions] = iccfind(rootDirectory)
Функция принимает строку (rootDirectory), которая является путем к корневому каталогу с файлами ICC-профилей, хранящихся на данном компьютере. Возвращаемыми значениями являются массив, который хранит структуры данных о всех файлах ICC-профилей в указанной директории, и массив строк, где каждая строка соответствует описанию файлов ICC-профилей. Пример работы представлен в листинге 5.
Листинг 5
>> [profiles, descriptions] = iccfind(iccroot) profiles =
[1x1 struct]
[1x1 struct]
[1x1 struct]
[1x1 struct] descriptions =
'Adobe RGB (1998)'
'AnimePalette'
'Apple RGB'
'Blacklight Poster'
[profiles, descriptions] = iccfind(rootDirectory, pattern)
Функция принимает строку (rootDirectory), которая является путем к корневому каталогу с файлами ICC-профилей, хранящихся на данном компьютере, и строку, которая должна содержаться в название файла без учета регистра. Возвращаемыми значениями являются массив, который хранит структуры данных о всех файлах ICC-профилей в указанной директории, и массив строк, где каждая строка соответствует описанию файлов ICC-профилей. Пример работы представлен в листинге 6.
Листинг 6
>> [profiles, descriptions] = iccfind(iccroot, 'rgb');
>> [profiles, descriptions]
ans = [1x1 struct] 'Adobe RGB (1998)'
[1x1 struct] 'Apple RGB'
173
[1x1 struct] 'CIE RGB'
[1x1 struct] 'ColorMatch RGB'
[1x1 struct] 'DCI P3 RGB (Gamma 2.6) 5900K (by Adobe)'
[1x1 struct] 'ProPhoto RGB'
[1x1 struct] 'Wide Gamut RGB'
[1x1 struct] 'sRGB IEC61966-2.1'
>> [profiles, descriptions] = iccfind(iccroot, 'adobe');
>> [profiles, descriptions]
ans = [1x1 struct] 'Adobe RGB (1998)'
[1x1 struct] 'DCI P3 RGB (Gamma 2.6) 5900K (by Adobe)'
Библиографический список
1. MatWork. Documentation. Электронный ресурс. URL: http:/ /www.mathworks.com/ (Дата обращения: 28.03.15)
2. Домасев М.В, Гнатюк С.П. Цвет, управление цветом, цветовые расчеты и измерения. - СПб.: Питер, 2009. - 224 с.
3. Международный консорциум по цветуИ^). Спецификация ICC.1:2004-10 (Версия профилей4.2.0.0). Технология управления цветом в изображениях - архитектура, формат профилей и структура данных.: 2004. - 102 с.
4. Нюберга Н.Д. Теоретические основы цветовой репродукции. - М.: Советская наука, 1947. - 147 с.
5. Фершильд М. [Fershild M.] Модели цветового восприятия. Второе издание.: пер. с англ.: Rochester Institute of Technology, USA, 2004. - 437 с.
6. Шашлов А.Б. Основы светотехники. - М.: Логос, 2011. -
256 с.
174