Цифровая обработка изображений, фильтры
Обработка изображений — одна из распространенных областей применения компьютерной графики. При этом на вход поступает одно или несколько изображений, которые подвергаются обработке с целью получения нового изображения. Примером подобной обработки изображений является обработка фотографий: изменение яркости, контрастности, цветового баланса, удаление эффекта «красных глаз» и т. п. Как известно… Читать ещё >
Цифровая обработка изображений, фильтры (реферат, курсовая, диплом, контрольная)
Обработка изображений — одна из распространенных областей применения компьютерной графики. При этом на вход поступает одно или несколько изображений, которые подвергаются обработке с целью получения нового изображения. Примером подобной обработки изображений является обработка фотографий: изменение яркости, контрастности, цветового баланса, удаление эффекта «красных глаз» и т. п.
Обычно изображения рассматривают как двухмерные массивы пикселов. Однако подобный подход может привести к проблеме, называемой алиасингом {aliasing). Поскольку это понятие будет регулярно возникать и далее, изучим его подробно.
Для того чтобы понять, почему эта проблема возникает, рассмотрим следующий простой пример. Пусть имеется функция */ = sin (ra:). Возьмем значения этой функции на сетке с заданным шагом, а в качестве такого шага используем значение 3/2 (рис. 8.1).
Рис. 8.1. Функция, замеряемая на сетке 114.
Далее возьмем полученные значения и попробуем восстановить исходную функцию. Однако можно увидеть, что получающиеся.
—тех
точки скорее соответствуют другой функции: sin- (рис. 8.2).
Это происходит из-за того, что шаг дискретизации слишком велик по сравнению с периодом функции.
Рис. 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) резких скачков яркости. Данный фильтр использует свертку с ядром размером 3×3 к яркости изображения. Простейший способ получения яркости по ДСД-значению цвета — использование следующей взвешенной суммы:
Стандартный фильтр для выделения скачков яркости (выделения границ, 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. Реализуйте фильтр, как в фильме «Город грехов»: для пикселов красного цвета необходимо увеличить насыщенность, а для всех остальных — уменьшить.