ЦИФРОВАЯ ОБРАБОТКА ИЗОБРАЖЕНИЙ, ФИЛЬТРЫ

Обработка изображений — одна из распространенных областей применения компьютерной графики. При этом на вход поступает одно или несколько изображений, которые подвергаются обработке с целью получения нового изображения. Примером подобной обработки изображений является обработка фотографий: изменение яркости, контрастности, цветового баланса, удаление эффекта «красных глаз» и т.п.

Обычно изображения рассматривают как двухмерные массивы пикселов. Однако подобный подход может привести к проблеме, называемой алиасингом {aliasing). Поскольку это понятие будет регулярно возникать и далее, изучим его подробно.

Для того чтобы понять, почему эта проблема возникает, рассмотрим следующий простой пример. Пусть имеется функция */ = sin(ra:). Возьмем значения этой функции на сетке с заданным шагом, а в качестве такого шага используем значение 3/2 (рис. 8.1).

Функция, замеряемая на сетке 114

Рис. 8.1. Функция, замеряемая на сетке 114

Далее возьмем полученные значения и попробуем восстановить исходную функцию. Однако можно увидеть, что получающиеся

—тех

точки скорее соответствуют другой функции: sin- (рис. 8.2).

3

Это происходит из-за того, что шаг дискретизации слишком велик по сравнению с периодом функции.

Возможные функции, проходящие через заданные точки на сетке

Рис. 8.2. Возможные функции, проходящие через заданные точки на сетке

Как известно из курса математического анализа, функцию можно разложить в ряд Фурье, т.е. представить в виде суммы бесконечного числа гармоник. Теорема Котельникова (в англоязычной литературе обычно используют термин Nyquist limit) утверждает, что если в разложении функции отсутствуют частоты, большие со, то эта функция может быть восстановлена но значениям, взятым

с шагом не более чем —.

2со

В нашем примере период функции Т равен 2, поэтому частота равна со = -^ = 0,5 Гц. Следовательно, мы можем восстановить функцию только в том случае, если шаг меньше, чем —= 1. Однако

2 * 5

мы взяли шаг, равный 1,5, а это больше единицы, поэтому условия теоремы Котельникова не выполнены, что и привело к неоднозначности в восстановлении функции.

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

Основным способом борьбы с алиасингом является подавление высоких частот в исходном изображении с помощью сглаживания.

Далее рассмотрим некоторые наиболее распространенные фильтры для обработки изображений (под фильтром будем понимать некоторую процедуру получения нового изображения из заданного).

Многие фильтры построены на основе операции свертки (convolution). В одномерном случае, если исходное изображение — это набор значений a0,av..., an V то результат свертки изображения с ядром k задается формулой

Величина Доопределяет размер ядра — массива & Л,, ...,?v. Например, при наличии одномерного массива входных данных aQ, av..., ал_, в результате применения свертки с ядром размера 3 получим следующий набор значений:

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

Один из вариантов заключается в том, что вместо обращения к элементу за пределами массива мы берем крайний элемент с соответствующей границы массива, т.е. в результате применения фильтра с ядром размера 3 к первому элементу массива а0, av..., ая_, получим значение ank , +a0k0 +афу

Для двухмерного случая используется следующая формула:

В этом случае ядро свертки задается квадратной матрицей к.

Одним из простейших в применении является фильтр, предназначенный для выделения на исходном изображении (рис. 8.3) резких скачков яркости. Данный фильтр использует свертку с ядром размером 3x3 к яркости изображения. Простейший способ получения яркости по ДСД-значению цвета — использование следующей взвешенной суммы:

Стандартный фильтр для выделения скачков яркости (выделения границ, edge detection) использует разностную аппроксимацию первых производных к яркости исходного изображения и использует следующие матрицы в качестве ядра свертки:

Исходное изображение, к которому применяют фильтры

Рис. 8.3. Исходное изображение, к которому применяют фильтры

Результат применения фильтра Превитта

Рис. 8.4. Результат применения фильтра Превитта

Чуть более сложным является фильтр Превитта (рис. 8.4), использующий следующие матрицы в качестве ядра свертки:

Хороший результат также дает использование фильтра Собеля (рис. 8.5):

Результат применения фильтра Собеля

Рис. 8.5. Результат применения фильтра Собеля

Вместо вычисления первой производной можно использовать разностный аналог лапласиана (рис. 8.6):

Результат применения лапласиана к изображению

Рис. 8.6. Результат применения лапласиана к изображению

Еще одним интересным фильтром является фильтр тиснения (emboss). На рис. 8.7 приведен результат применения этого фильтра к яркости исходного изображения.

Результат применения фильтра тиснения

Рис. 8.7. Результат применения фильтра тиснения

Данный фильтр использует следующее ядро:

Один из довольно простых фильтров, применяемых не к яркости изображения, а по отдельности к каждому из цветовых каналов, — фильтр повышения контрастности. Он использует ядро

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

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

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

где С — нормировочный коэффициент, необходимый для того, чтобы сумма всех элементов ядра равнялась единице.

Явная свертка с использованием этих весов требует (2JV + 1)2 обращений к изображениям для вычисления одного элемента, что при больших размерах ядра слишком затратно. Поэтому в данных случаях используют такое свойство ядра Гаусса, как сепарабельность.

Ядро к называется сепарабельным, если его можно представить в виде

где а и Ъ — некоторые одномерные массивы.

Ядро Гаусса является сепарабельным, причем в качестве коэффициентов а и b выступает одномерное ядро Гаусса:

Если ядро к является сепарабельным, то свертку с этим ядром можно представить как две одномерные свертки:

Для случая размытия по Гауссу сначала выполняем одномерную свертку по ху а затем — одномерную свертку по у. Общее число выборок из изображения в результате оказывается гораздо меньше, чем в общем случае (зависимость от размера ядра получается линейной — 2(2N + 1), а не квадратичной).

Красивым эффектом обработки изображений является коррекция цвета. Для этого каждый пиксел изображения переводят из цветового пространства RGB в цветовое пространство HSV

и в этом пространстве изменяют насыщенность цвета, после чего получившийся цвет переводят обратно в RGB. Подобным образом можно легко реализовать эффект, использованный в фильме «Город грехов»: каждый пиксел переводят в цветовое пространство HSV, далее по тону определяют, является ли заданный цвет красным, и в зависимости от этого его насыщенность либо увеличивают, либо уменьшают. После этого цвет переводят обратно в RGB.

Часто многие сложные эффекты можно представить как результат последовательного применения ряда простых фильтров. Рассмотрим следующий пример: задано двухмерное изображение, в котором все пикселы (при работе с изображениями отдельные элементы изображения часто называют не пикселами, а текселами, от texture element), цвет которых отличается от заданного (считающегося прозрачным), образуют некоторое изображение. Наша задача — построить тень от этого изображения.

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

Следующий фильтр — размытие по Гауссу, размер ядра зависит от того, насколько большую тень мы хотим получить: чем больше размер тени, тем больше должен быть размер ядра.

Еще один фильтр сдвигает изображение, полученное на предыдущем шаге, вправо и вниз, поскольку тень обычно сдвинута по отношению к отбрасывающему ее объекту.

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

Контрольные вопросы и упражнения

  • 1. Приведите примеры, когда вы сталкивались с алиасингом.
  • 2. Является ли сепарабельным фильтр, заданный матрицей
  • 3. Пусть изображение задано массивом значений и каждому пикселу соответствует всего один байт, задающий его яркость (такие изображения называются изображением в оттенках серого цвета). Реализуйте фильтр, применяющий заданное ядро (массив из девяти чисел с плавающей точкой) к этому изображению и возвращающий полученное изображение.
  • 4. Реализуйте размытие по Гауссу размера 10 к заданному изображению. При этом изображение считайте заданным так же, как и в предыдущем упражнении.
  • 5. Реализуйте фильтр, как в фильме «Город грехов»: для пикселов красного цвета необходимо увеличить насыщенность, а для всех остальных — уменьшить.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >