Direct2D. Contrast & Sharpen. Контраст и резкость

D2D Contrast Sharpen

Контраст и резкость в Direct2D представлены эффектами Contrast и Sharpen соответственно. Как обычно, Microsoft опять накосячил с математикой в документации. Эта неприятность будет исправлена ниже.

Контраст

Эффект Contrast увеличивает или уменьшает контрастность изображения. Возникает закономерный вопрос, что такое контрастность. Это такой же субъективный параметр, как и «яркость». Существует только в рамках всего изображения. Нельзя взять один цвет и заявить, что он очень контрастный.

Иоханнес Иттен в «Искусстве цвета» выделял 7 видов контраста. В нашем случае актуален второй тип: Контраст светлого и темного.

Эффект Contrast

Эффект контраста доступен только с версии Windows 10. Никакие ухищрения не позволят поставить DirectX 12 на другие версии Windows. Такова политика Microsoft.

Снова подключаем модуль Winapi.D2DMissing из библиотеки SVGIconImageList. Напомню, это из-за «бедности» Delphi на заголовки D2D. В этом модуле содержится описание для интерфейсов: ID2D1DeviceContext, ID2D1Image и ID2D1Effect. Остальное по-прежнему ищем и дописываем руками.

CLSID для эффекта Contrast:

Эффекту контраста требуются установить два свойства:

D2D1_CONTRAST_PROP_CONTRAST
Значение с плавающей запятой. Указывает величину контрастности изображения.
Отрицательные значения уменьшают контраст, положительные — увеличивают.
Минимальное значение: -1.0, максимальное: 1.0. 
Значение по умолчанию для свойства: 0,0.
D2D1_CONTRAST_PROP_CLAMP_INPUT
Логическое значение, указывающее, ограничивать ли ввод до [0.0, 1.0]. 
Значение по умолчанию для свойства — FALSE.

Если честно, по второму параметру особого эффекта от применения не заметил.

Функция создания эффекта Contrast выглядит так:

Математика эффекта Contrast

Эффект контраста обрабатывает каждый цветовой канал, согласно уравнениям ниже. Уравнения представляют из себя два кусочно-квадратичных полинома, который встречаются в точке (0.5,0.5). В диаграмме по оси X — исходное значение канала, в диапазоне [0..1]. По оси Y — результат усиления или уменьшения контраста.

Ниже иллюстрация из статьи MSDN, посвященной эффекту контраста.

Рис.1. Такой расчет в MSDN.

Применить математику

Попытка воспроизвести формулы никак не влияет на форму кривой в центре. На рисунке представлены результаты применения эффекта с максимальными и минимальными значениями контраста. Эффект виден, кривая — нет.

Рис.2. Максимальный и минимальный контраст

Воспользуемся методом из прошлой статьи. У нас уже есть шаблон с равномерным распределением цвета-яркости. Применим к нему эффект Contrast и прочитаем получившиеся значения.

Уже два эффекта желают получать данные именно так, через шаблон. Поэтому модифицируем код. Создание WicImage, получение кривой и прочие общие штуки вынесем в отдельную функцию.

Общая функция применения любого эффекта и получения кривой

[свернуть]

Почти такая же функция, как для получения значений яркости. Однако, само создание конкретного эффекта обернуто процедурой.

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

После обработки шаблона при максимальном контрасте получили кривую, один в один, как в статье MSDN на рис.1. Поэтому, разбираемся и убираем сомнительные места из математики эффекта.

Рис.3. Реальная кривая контраста

Исправление косяков математики

Чтобы сильно не умничать сразу укажу проблемные места.

Рис.4. Удивительно, но контраст тут подразумевается от -100 до 100

Все рассуждения в статье ведутся в диапазоне [0..1] для каналов и [-1..1] для контраста. Однако конкретно в этом случае человек решил, что контраст изменяется в диапазоне [-100..100]. Поэтому дополнительно разделил на 100. Это не верно, а правильно так:

Latex formula

И второй момент:

Рис.5. Странные полиномы

Представленные уравнения не являются квадратичными полиномами. Вот если убрать последнее умножение и оставить только коэффициент С, они станут полиномами:

Latex formula

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

И наша старая знакомая, имею ввиду несостоявшуюся кривую, теперь выглядит так:

Рис.6. Максимальный и минимальный контраст с правильной кривой

Резкость

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

Cambridge in Colour

В Direct2D резкость представлена эффектом Sharpen. Эффект только повышает резкость. Понижением резкости, то есть размытием, занимается Gaussian blur эффект, про который говорилось ранее.

Эффект Sharpen

Эффект контраста, также как и эффект резкости, доступен только начиная с версии Windows 10.

По тем же причинам нужен модуль Winapi.D2DMissing.

CLSID для эффекта Contrast:

Свойства эффекта:

D2D1_SHARPEN_PROP_SHARPNESS
Значение с плавающей запятой.
Определяет насколько повысить резкость входного изображения. 
Допустимый диапазон от 0.0 до 10.0 
Значение по умолчанию: 0.0
D2D1_SHARPEN_PROP_THRESHOLD
Значение с плавающей запятой. 
Определяет минимальный перепад яркости между соседними областями, чтобы граница между ними считалась контуром. Чем ниже порог, тем более незаметные детали будут подвергаться эффекту резкости.
Допустимый диапазон от 0.0 до 1.0
Значение по умолчанию: 0.0

Функция создания эффекта Sharpen выглядит следующим образом:

Примеры

Рис.7. Применен только эффект резкости
Рис.8. Совместная работа эффектов контраста и резкости

Скачать

Исходники (Delphi XE 7-10) 2.84 Mб

Исполняемый файл D2DEffects 0.2 (zip) 1.78 Мб


5 5 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Alexey

Видны некоторые изменения по демо-программе, что радует ) Впрочем, как и сама статья. Жду продолжения цикла, читается как детектив с математическим расследованием: конечно же, благодаря ошибкам в документации MS =)

Последний раз редактировалось 2 лет назад BlackWitcher ем
2
0
Не нашли ответ на свой вопрос? Задайте его здесь!...x