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

Для Андроид 07.05.2019
Для Андроид

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

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

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

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

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 есть фильтр «Матрица свёртки», который упрощает поиск необходимого Вам матричного преобразования.

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Аннотация: Введение. Линейные фильтры: определение, сглаживающие фильтры, контрастоповышающие фильтры, разностные фильтры. Нелинейные фильтры: примеры нелинейных фильтров, морфологические операторы

8.1. Введение

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

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

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

8.2. Линейные фильтры

Определение

(8.1)

Результатом служит изображение B . В определении (8.1) мы опустили пределы суммирования. Обычно ядро фильтра отлично от нуля только в некоторой окрестности N точки (0, 0) . За пределами этой окрестности F(i, j) или в точности равно нулю, или очень близко к нему, так что можно им пренебречь. Суммирование в (8.1) производится по , и значение каждого пикселя B(x, y) определяется пикселями изображения A , которые лежат в окне N , центрированном в точке (x, y) (мы будем обозначать это множество N(x, y) ). Ядро фильтра, заданное на прямоугольной окрестности N , может рассматриваться как матрица m на n , где длины сторон являются нечетными числами. При задании ядра матрицей M kl , ее следует центрировать:

(8.2)

Также нуждается в дополнительном прояснении ситуация, когда пиксель (x, y) находится в окрестности краев изображения. В этом случае A(x + i, y + j) в определении (8.1) может соответствовать пикселю A , лежащему за пределами изображения A . Данную проблему можно разрешить несколькими способами.

  • Не проводить фильтрацию для таких пикселей, обрезав изображение B по краям или закрасив их, к примеру, черным цветом.
  • Не включать соответствующий пиксель в суммирование, распределив его вес F(i, j) равномерно среди других пикселей окрестности N(x, y) .
  • Доопределить значения пикселей за границами изображения при помощи экстраполяции. Например, считать постоянным значение интенсивности вблизи границы (для пикселя (-2, 5) имеем A(-2, 5) = A(0, 5) ) или считать постоянным градиент интенсивности вблизи границы (A(-2, 5) = A(0, 5) + 2(A(0, 5) - A(1, 5)) ).
  • Доопределить значения пикселей за границами изображения, при помощи зеркального отражения (A(-2, 5) = A(2, 5) ).

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

Разобрав общее определение линейных фильтров, перейдем к примерам.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ниже представлено применение матрицы свёртки:

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

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

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

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

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

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

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

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

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

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

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

II. Второй метод (дополнение) требует создания промежуточного изображения. Идея в том, чтобы создавать временное изображение с размерами (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 есть фильтр «Матрица свёртки», который упрощает поиск необходимого Вам матричного преобразования.

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

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

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

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

Алгоритм медианного фильтра следующий: Для текущего пикселя, пиксели, которые «попадают» в матрицу, сортируются, и выбирается средние значение из отсортированного массива. Это значение и является выходным для текущего пикселя. Ниже представлена работа медианного фильтра для размера ядра равного трём.

Фильтры эрозия и наращивание

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

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

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

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

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

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 есть фильтр «Матрица свёртки», который упрощает поиск необходимого Вам матричного преобразования.

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

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

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

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

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

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

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

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

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

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

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

Заключение

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



Рекомендуем почитать

Наверх