Графические фильтры на основе матрицы скручивания. Обзор методов фильтрации и сегментации цифровых изображений

Данная статья рассказывает не только о наиболее распространённых фильтрах обработки изображений, но в понятной форме описывает алгоритмы их работы. Статья ориентирована, прежде всего, на программистов, занимающихся обработкой изображений.

Матрица свёртки

Фильтров использующих матрицу свёртки много, ниже будут описаны основные из них.

Матрица свёртки – это матрица коэффициентов, которая «умножается» на значение пикселей изображения для получения требуемого результата.
Ниже представлено применение матрицы свёртки:

div – это коэффициент нормирования, для того чтобы средняя интенсивность оставалась не изменой.

В примере матрица имеет размер 3x3, хотя размер может быть и больше.

Фильтр размытия

Наиболее часто используемым фильтром, основанным на матрице свёртки, является фильтр размытия.

Обычно матрица заполняется по нормальному (гауссовому закону). Ниже приведена матрица размытия 5x5 заполненная по закону Гауссовского распределения.


Коэффициенты уже являются нормированными, так что div для этой матрицы равен одному.

От размера матрицы зависит сила размытия.


Стоит упомянуть о граничных условиях (эта проблема актуальна для всех матричных фильтров). У верхнего левого пикселя не существует «соседа» с права от него, следовательно, нам не на что умножать коэффициент матрицы.

Существует 2 решения этой проблемы:

1. Применение фильтра, только к «окну» изображения, которое имеет координаты левого верхнего угла , а для правого нижнего . kernelSize – размер матрицы; width, height – размер изображения.

Это не лучший способ, так как фильтр не применяется ко всему изображению. Качество при этом довольно сильно страдает, если размер фильтра велик.

2. Второй метод требует создания промежуточного изображения. Идея в том, чтобы создавать временное изображение с размерами (width + 2 * kernelSize / 2, height + 2 * kernelSize / 2). В центр изображения копируется входная картинка, а края заполняются крайними пикселями изображения. Размытие применяется к промежуточному буферу, а потом из него извлекается результат.


Данный метод не имеет недостатков в качестве, но необходимо производить лишние вычисления.

Фильтр размытия по Гауссу имеет сложность O(hi * wi * n *n), где hi, wi – размеры изображения, n – размер матрицы (ядра фильтра). Данный алгоритм можно оптимизировать с приемлемым качеством.

Квадратное ядро (матрицу) можно заменить двумя одномерными: горизонтальным и вертикальным. Для размера ядра 5 они будут иметь вид:

Фильтр применяется в 2 прохода: сначала горизонтальный, а потом к результату вертикальный (или на оборот).

Сложность данного алгоритма будет O(hi * wi * n) + O(hi * wi * n) = 2 * O(hi * wi * n), что для размера ядра больше двух, быстрее, чем традиционный метод с квадратной матрицей.

Фильтр улучшения чёткости

Для улучшения четкости необходимо использовать следующую матрицу:

Эта матрица увеличивает разницу значений на границах. Div для этой матрицы равен 1.


В программе GIMP есть фильтр «Матрица свёртки», который упрощает поиск необходимого Вам матричного преобразования.

Более подробную информацию о фильтрах основанных на матрице свёртки вы можете найти в статье «Графические фильтры на основе матрицы скручивания» .

Медианный фильтр

Медианный фильтр обычно используется для уменьшения шума или «сглаживания» изображения.

Фильтр работает с матрицами различного размера, но в отличие от матрицы свёртки, размер матрицы влияет только на количество рассматриваемых пикселей.

Алгоритм медианного фильтра следующий:

Для текущего пикселя, пиксели, которые «попадают» в матрицу, сортируются, и выбирается средние значение из отсортированного массива. Это значение и является выходным для текущего пикселя.

Ниже представлена работа медианного фильтра для размера ядра равного трём.


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


В результате наращивания происходит увеличение ярких объектов, а эрозии – увеличение тёмных объектов.

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

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

Заключение

В статье были описаны некоторые из фильтров обработки изображения, описаны их алгоритмы и особенности применения.

Фильтрация с использованием функции imfilter

Фильтрация изображений, в том числе корреляция и конволюция, могут быть реализованы с помощью функции imfilter. Рассмотрим пример фильтрации изображения скользящей апертурой с размерами 5×5 и одинаковыми весовыми составляющими. Такой фильтр называется усредняющим фильтром.

I = imread("coins.png"); h = ones(5,5) / 25 h = 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 I2 = imfilter(I,h); imshow(I); % Исходное изображение figure, imshow(I2); % Изображение после фильтрации

Типы данных

Типы данных в функции imfilter устанавливаются также, как и при использовании других похожих арифметических функций. Результирующее изображение будет представлено в том же формате данных, что и исходное изображение. Функция imfilter вычисляет значения каждого результирующего пикселя в формате удвоенной точности, проводя арифметические операции с плавающей запятой. Если результирующие значения превышают диапазон, который определен для данного типа данных, то функция imfilter может обрезать их до нужного диапазона. Это зависит от формата представления данных. Если данные представлены в формате integer, тогда функция imfilter округляет дробную часть.

Таким образом, при использовании функции imfilter необходимо учитывать формат представления данных изображения. Рассмотрим пример, где в результате применения функции imfilter получены отрицательные значения. Исходные данные были представлены в формате double.

A = magic(5) A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 h = [-1 0 1] h = -1 0 1 imfilter(A,h) ans = 24 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -2

Отметим, что результат представлен также и отрицательными значениями. Если матрицу A представить не в формате double, а в формате uint8, то получим такой результат:

A = uint8(magic(5)); imfilter(A,h) ans = 24 0 0 14 0 5 0 9 9 0 6 9 14 9 0 12 9 9 0 0 18 14 0 0 0

После того, как исходные данные были представлены в формате uint8, то результирующие данные также представляются в формате uint8, а отрицательные значения будут обрезаны до 0. Таким образом, исходные данные перед применением функции imfilter можно преобразовать и в другие форматы, например, signed integer, single или double.

Опции корреляции и свертки

Функция imfilter может выполнять фильтрацию с использованием корреляции или свертки. По умолчанию используется корреляция, поскольку функции формирования фильтров формируют корреляционные ядра.

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

A = magic(5); h = [-1 0 1] imfilter(A,h) % фильтрация с использованием корреляции ans = 24 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -2 imfilter(A,h,"conv") % фильтрация с использованием свертки ans = -24 16 16 -14 8 -5 16 -9 -9 14 -6 -9 -14 -9 20 -12 -9 -9 16 21 -18 -14 16 16 2

Опция дополнения края изображения

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


Выход значений маски фильтра за границу изображения

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


Заполнение недостающих пикселей нулевыми значениями

Если отфильтровать изображение, заполняя недостающие пиксели нулями, то на результирующем изображении на границе изображения появится темная линия. Это показано на рисунке.

I = imread("eight.tif"); h = ones(5,5) / 25; I2 = imfilter(I,h); imshow(I), title("Исходное изображение"); figure, imshow(I2), title("Изображение после фильтрации");

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


Заполнение маски крайними пикселями изображения

При реализации фильтрации с использованием заполнения недостающих элементов крайними элементами изображения, необходимо дополнительно в функции imfilter указывать опцию "replicate".

I3 = imfilter(I,h,"replicate"); figure, imshow(I3);

Функция imfilter поддерживает также другие способы заполнения недостающих пикселей при обработке крайних элементов изображения. Для этого есть такие опции как "circular" и "symmetric". Для более детальной информации см. описание функции imfilter.

Многомерная фильтрация

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

Рассмотрим пример обработки цветного изображения, где реализована фильтрация каждого цветового слоя:


Система MATLAB располагает несколькими двумерными и многомерными функциями фильтрации. Функция filter2 выполняет двумерную линейную фильтрацию, conv2 выполняет свертку двумерных сигналов, а convn – свертку многомерных сигналов. При работе с каждой из этих функций необходимо, чтобы исходные данные были представлены в формате double. Результат также будет представлен в формате double. Эти функции всегда используют заполнение нулями недостающих пикселей при работе на краю изображения и не поддерживают других способов заполнения.

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

Использование предопределенных типов фильтров

Функция fspecial обладает возможностью формирования нескольких видов предопределенных фильтров, что отражается на форме маски. После создания фильтра с помощью функции fspecial его можно применить для обработки данных изображения с помощью функции imfilter. Рассмотрим пример реализации фильтра типа нечеткого маскирования для обработки полноцветного изображения. Метод нечеткого маскирования эффективно применяется для усиления границ и повышения детализации изображений.

I = imread("moon.tif"); h = fspecial("unsharp") h = -0.1667 -0.6667 -0.1667 -0.6667 4.3333 -0.6667 -0.1667 -0.6667 -0.1667 I2 = imfilter(I,h); imshow(I), title("Исходное изображение ") figure, imshow(I2), title("Обработанное изображение")

Частотные методы преобразований

Частотные методы преобразований используют как одномерные, так и двумерные фильтры с конечной импульсной характеристикой. Эти методы используют матрицу преобразований, элементы которой определяют частотные преобразования.

Функция приложения ftrans2 предназначена для реализации частотных методов обработки изображений. Эта функция формирует маску линейного двумерного фильтра, используя метод преобразования частот для трансформации одномерного фильтра с конечной импульсной характеристикой. (Для более детальной информации см. Jae S. Lim, Two-Dimensional Signal and Image Processing, 1990.

Отметим, что частотные методы преобразований обеспечивают очень хорошие результаты обработки. Рассмотрим пример.

B = remez(10,,); h = ftrans2(b); = freqz(b,1,64,"whole"); colormap(jet(64)) plot(w/pi-1,fftshift(abs(H))) figure, freqz2(h,)


Одномерный частотный отклик (слева) и соответствующий ему двумерный частотный отклик (справа)

Пример частотного метода

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

В приложении функция fsamp2 формирует маску линейного двумерного фильтра на основе желаемой амплитудно-частотной характеристики двумерного фильтра. Сформированная маска предназначена для передачи в соответствующие функции (например, filter2 или conv2), которые выполняют двумерную линейную фильтрацию. Рассмотрим сказанное выше на конкретном примере.

Hd = zeros(11,11); Hd(4:8,4:8) = 1; = freqspace(11,"meshgrid"); mesh(f1,f2,Hd), axis([-1 1 -1 1 0 1.2]), colormap(jet(64)) h = fsamp2(Hd); figure, freqz2(h,), axis([-1 1 -1 1 0 1.2])


Локальные (оконные) методы

В приложении Image Processing Toolbox существуют функции, которые формируют маски линейного фильтра по желаемой амплитудно-частотной характеристике с использованием одномерного или двумерного окна. При формировании матрицы желаемой амплитудно-частотной характеристики для получения более точного результата рекомендуется использовать отсчеты частоты, которые возвращаются функцией freqspace.

Рассмотрим это на примере.

Hd = zeros(11,11); Hd(4:8,4:8) = 1; = freqspace(11,"meshgrid"); mesh(f1,f2,Hd), axis([-1 1 -1 1 0 1.2]), colormap(jet(64)) h = fwind1(Hd,hamming(11)); figure, freqz2(h,), axis([-1 1 -1 1 0 1.2])


Желательный двумерный частотный отклик (слева) и реальный двумерный частотный отклик (справа)

Создание желательной амплитудно-частотной характеристики

Функции проектирования фильтров fsamp2, fwind2 и fwind2 создают фильтры на основе матрицы значений желаемой амплитудно-частотной характеристики. Соответствующую желаемую амплитудно-частотную характеристику можно создавать с помощью функции freqspace.

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

Freqspace(25,"meshgrid"); Hd = zeros(25,25); d = sqrt(f1.^2 + f2.^2)


Идеальный кругообразный низкочастотный отклик

Вычисление частотного отклика фильтра

Функция freqz2 вычисляет частотный отклик двумерного фильтра. Если для фильтра с конечной импульсной характеристикой принять, что

H =;

то рассмотрим вычисление и визуализацию 64×64 точек частотного отклика h.

Freqz2(h)


Частотный отклик двумерного фильтра

Для получения частотного отклика H и вектора частот f1 и f2, используем следующий код

Freqz2(h);

Пример.

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

Некоторые виды преобразований в обработке изображений

В большинстве случаев, математически изображение представляют в виде функции от двух пространственных переменных ƒ(x,y) . Значение функции в точке (x,y) эквивалентно уровню интенсивности в этой точке.

  1. Преобразование Фурье;
  2. Дискретные косинусные преобразования
  3. Преобразования Радона
  4. Проекционные преобразования

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

Термин

Определение

Дискретные преобразования

Это вид преобразований, при которых исходные и результирующие данные представляются в виде дискретных значений. Дискретные преобразования, которые реализованы в MATLAB и, в частности в Image Processing Toolbox, включают дискретное преобразование Фурье и дискретные косинусные преобразования.

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

Альтернативное математическое представление изображений. Например, при преобразованиях Фурье изображение представляется в виде суммы комплексных экспоненциальных переменных амплитуды, частоты и фазы. Этот тип преобразований наиболее часто используется при анализе, улучшении и сжатии изображений.

Данная статья рассказывает не только о наиболее распространённых фильтрах обработки изображений, но в понятной форме описывает алгоритмы их работы. Статья ориентирована, прежде всего, на программистов, занимающихся обработкой изображений.

Матрица свёртки

Фильтров использующих матрицу свёртки много, ниже будут описаны основные из них.

Матрица свёртки – это матрица коэффициентов, которая «умножается» на значение пикселей изображения для получения требуемого результата.
Ниже представлено применение матрицы свёртки:

Div – это коэффициент нормирования, для того чтобы средняя интенсивность оставалась не изменой.

В примере матрица имеет размер 3x3, хотя размер может быть и больше.

Фильтр размытия

Наиболее часто используемым фильтром, основанным на матрице свёртки, является фильтр размытия.

Обычно матрица заполняется по нормальному (гауссовому закону). Ниже приведена матрица размытия 5x5 заполненная по закону Гауссовского распределения.

Коэффициенты уже являются нормированными, так что div для этой матрицы равен одному.

От размера матрицы зависит сила размытия.

Стоит упомянуть о граничных условиях (эта проблема актуальна для всех матричных фильтров). У верхнего левого пикселя не существует «соседа» с права от него, следовательно, нам не на что умножать коэффициент матрицы.

Существует 2 решения этой проблемы:

1. Применение фильтра, только к «окну» изображения, которое имеет координаты левого верхнего угла , а для правого нижнего . kernelSize – размер матрицы; width, height – размер изображения.

Это не лучший способ, так как фильтр не применяется ко всему изображению. Качество при этом довольно сильно страдает, если размер фильтра велик.

2. Второй метод (дополнение) требует создания промежуточного изображения. Идея в том, чтобы создавать временное изображение с размерами (width + 2 * kernelSize / 2, height + 2 * kernelSize / 2). В центр изображения копируется входная картинка, а края заполняются крайними пикселями изображения. Размытие применяется к промежуточному буферу, а потом из него извлекается результат.

Данный метод не имеет недостатков в качестве, но необходимо производить лишние вычисления.

Фильтр размытия по Гауссу имеет сложность O(hi * wi * n *n), где hi, wi – размеры изображения, n – размер матрицы (ядра фильтра). Данный алгоритм можно оптимизировать с приемлемым качеством.

Квадратное ядро (матрицу) можно заменить двумя одномерными: горизонтальным и вертикальным. Для размера ядра 5 они будут иметь вид:

Фильтр применяется в 2 прохода: сначала горизонтальный, а потом к результату вертикальный (или на оборот).

Сложность данного алгоритма будет O(hi * wi * n) + O(hi * wi * n) = 2 * O(hi * wi * n), что для размера ядра больше двух, быстрее, чем традиционный метод с квадратной матрицей.

Фильтр улучшения чёткости

Для улучшения четкости необходимо использовать следующую матрицу:

Эта матрица увеличивает разницу значений на границах. Div для этой матрицы равен 1.

В программе GIMP есть фильтр «Матрица свёртки», который упрощает поиск необходимого Вам матричного преобразования.

Более подробную информацию о фильтрах основанных на матрице свёртки вы можете найти в статье .

Медианный фильтр

Медианный фильтр обычно используется для уменьшения шума или «сглаживания» изображения.

Фильтр работает с матрицами различного размера, но в отличие от матрицы свёртки, размер матрицы влияет только на количество рассматриваемых пикселей.

Алгоритм медианного фильтра следующий:

Для текущего пикселя, пиксели, которые «попадают» в матрицу, сортируются, и выбирается средние значение из отсортированного массива. Это значение и является выходным для текущего пикселя.

Ниже представлена работа медианного фильтра для размера ядра равного трём.

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

В результате наращивания происходит увеличение ярких объектов, а эрозии – увеличение тёмных объектов.

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

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

Заключение

В статье были описаны некоторые из фильтров обработки изображения, описаны их алгоритмы и особенности применения.

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

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

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

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

Пусть – значение яркости изображения – полезного сигнала на пересечении i -ой строки и j -го столбца, а наблюдаемое на входе фильтра изображение описывается моделью:

Здесь – значение помехи в точке с координатами (i,j) , f() – функция, описывающая взаимодействие сигнала и помехи, а I и J – число строк и столбцов в кадре соответственно.

На рисунке 1 показаны примеры окрестностей различных типов, изображенные в виде совокупностей точек. Центром окрестностей, рабочей точкой, в которой осуществляется обработка, является точка с координатами (i,j) .

Рис. 1 Примеры окрестностей различных видов

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

При линейной фильтрации выходной эффект определяется линейной комбинацией входных данных:

В этом выражении – результат фильтрации полезного сигнала в точке кадра с координатами (i,j) , S – множество точек, образующих окрестность, – весовые коэффициенты, совокупность которых представляет собой двумерную импульсную характеристику (ИХ). Если область S конечна, то импульсная характеристика имеет конечную длину и фильтр называется КИХ-фильтром. В противном случае импульсная характеристика имеет бесконечную длину, а фильтр называется БИХ-фильтром. Импульсная характеристика не зависит от координат точки, в которой определяется выходной эффект. Процедуры обработки изображений, обладающие свойством независимости от координат, называются однородными (изопланатичными).

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

которое является дополнительным требованием к импульсной характеристике фильтра.

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

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

  • Инверсия цветов.
  • Размытие.
  • Увеличение резкости.
  • Тиснение.
  • Акварельный эффект.

Матрица – ядро свертки

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

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

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

Инверсия цветов

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

Алгоритм размытия

Для того, чтобы размыть изображение, нам потребуется считать в память значения RGB -составляющих цвета каждого пикселя. После чего ядро размывания будет применено ко всем составляющим компонентам цвета всех пикселей редактируемого изображения:
Рисунок 1. Матрица для фильтра "Размытие".

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

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

Чтобы увеличить ядро размытия, вы можете:

  • использовать ядро большего размера (так цвет будет распределяться среди большего количества соседних пикселей);
  • изменять коэффициенты таким образом, чтобы уменьшить влияние центрального коэффициента;
  • выполнить фильтрацию изображения не однократно;

Алгоритм увеличения резкости

Создавая эффект увеличения резкости, мы выполняем все тот же алгоритм, но используем другое ядро, так как теперь нашей целью является увеличение резкости изображения. Ядро G для увеличения резкости:
Рисунок 2. Матрица для фильтра "Увеличение резкости".
Как и в предыдущем случае, мы по отдельности обрабатываем RGB -составляющие, после чего формируем значения цвета обрабатываемого пикселя. Для увеличения контраста между центральным пикселем и соседями используются отрицательные весовые коэффициенты.

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

Алгоритм тиснения

Тиснение выполняется аналогично, но в данном случае мы используем не одну матрицу, а несколько.
Рисунок 3.1 Матрица для фильтра "Тиснение": шаг первый.
В то время как ядра размытия и резкости имели сумму коэффициентов равную единице, в данном случае сумма весов в ядре тиснения равна 0 . Если сумма коэффициентов не будет равна 0 , мы получим отклонение к какому-то конкретному цвету.

Полученное значение цвета будет дополнительно обработано (усреднено) и приведено к диапазону 0-255 (подробнее вы сможете увидеть при реализации данного фильтра). Меняя значения позиций 1 и -1 , мы можем получить измененное направление подсветки.
Рисунок 3.2. Матрица для фильтра "Тиснение": шаг второй.

Алгоритм акварелизации

Название акварельного фильтра говорит само за себя: результирующее изображение будет выглядеть так, как будто его нарисовали акварелью. На первом этапе применения данного фильтра мы сгладим цвета редактируемого изображения.
Рисунок 4.1. Матрица для фильтра "Акварельный эффект": шаг первый.
На следующем этапе мы увеличим резкость переходов для завершения создания эффекта акварели.
Рисунок 4.2. Матрица для фильтра "Акварельный эффект": шаг второй.
Вот и все. Немного подкорректировав параметры матрицы, мы можем получать как более резкий, так и более плавный эффект акварелизации. br />


Есть вопросы?

Сообщить об опечатке

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