Как настроить смартфоны и ПК. Информационный портал
  • Главная
  • Программы
  • Обзор методов фильтрации и сегментации цифровых изображений. Общие понятия фильтрации изображений

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

В статье пойдет речь об использовании convolution matrix (матрицы скручивания или матрицы свертки), с помощью которой можно создавать и накладывать на изображения фильтры, такие как blur, sharpen и многие другие.

Cтатья будет интересна не только веб-программистам, но и всем кто так или иначе занимается программной обработкой изображений, поскольку функции для работы с матрицей скручивания имеются во многих языках (точно известно о php и flash). Так же, статья будет интересна дизайнерам, использующим Adobe Photoshop, поскольку в нем имеется соответствующий фильтр (Filter-Other-Custom).

Примеры будут на языке PHP с использованием библиотеки GD. Теория, практика, примеры (осторожно, много картинок!)

Теория

Говоря не математическим языком, convolution - это преобразование одной матрицы с помощью другой, которая называется ядром ("kernel"). При обработке изображений в качестве исходных выступают матрицы RGB-каналов пикселей в прямоугольных координатах.

В качестве ядра обычно используется матрица размером 3x3, но возможно и больше (5x5, 7x7 и т.д.). Ядро содержит степени влияния ("ценности") окружающих значений элемента на сам элемент.

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

Вот простой графический пример:

Преобразуемое значение выделено красным, область действия матрицы ядра - зеленым.

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

(40*0)+(42*1)+(46*0)+(46*0)+(50*0)+(55*0)+(52*0)+(56*0)+(58*0) = 42

Как видно, данное преобразование смещает изображение вниз на 1 пиксель.

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

Значения div и offset

При обработке изображений одним только преобразованием не отделаешься, нужна еще нормализация. Что делать, если получившееся значение больше 255 или меньше 0? Цветов-то таких нет. Более того, что выход за границы цвета явление достаточно частое.

Для нормализации результата используются дополнительные переменные: div (делитель) и offset (коэффициент). Они работают очень просто: результат преобразования делится на div и к нему прибавляется offset.

Не трудно догадаться, что по умолчанию div = 1, offset = 0 (div = 0 выставлять нельзя!).

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

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

Простой пример: фильтр "негатив".

В качестве исходного мы возьмем следующее изображение:

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

Согласно матрице, получается, что в результате преобразования все цвета будут иметь отрицательную величину. Чтобы цвета были негативными, нужно задать offset = 256, таким образом цвета всех пикселей вычитаются из 256, что является негативным изображением:

Как это делается на PHP

В библиотеке GD на PHP существует функция imageconvolution, которая содержит 4 параметра. Первый - это идентификатор изображения. Второй - это матрица в виде массива из 3-х массивов с 3-мя переменными. Третий и четвертый - это div и offset.

Вот код, который делает изображение негативным:

    $img = imagecreatefromjpeg ("images/pattern.jpg" ) ;

    $matrix = array (

    array ( 0 , 0 , 0 ) ,

    array ( 0 , - 1 , 0 ) ,

    array ( 0 , 0 , 0 )

    imageconvolution ($img , $matrix , 1 , 256 ) ;

    imagejpeg ($img , "images/pattern_negative.jpg" , 100 ) ;

Сразу стоит сказать об одной очень неприятной особенности GD: при преобразованиях с помощью imageconvolution "рушится" альфа-канал. Этот баг был описан уже давно, но насколько я знаю, его так и не исправили. Во flash этого нет, более того там имееются еще дополнительные параметры, которые отвечают за обработку краёв изображений, когда часть пикселей выпадает. В php края просто не обрабатываются.

Blur, sharpen, emboss

Вот стандартный набор матриц эффектов:

Обратите внимание, для blur коэффициент div = 9. Для такой матрицы только такой коэффициент не ведет к искажению цветов. Еще надо сказать, что вариантов blur-а несколько, они незначительно отличаются силой эффекта.

И вот какие получаются изображения:

Sharpen:

"Аккуратные" эффекты

Как видно из прошлого примера с blur, эффект накладывается на изображение, но достаточно сильно. А можно ли уменьшить силу эффекта на изображение? Оказывается, можно. Но для этого надо изменять не степень влияния окружающих пикселей, как можно показаться на первый взгляд, а количество влияющих пикселей:

Тогда получим эффекты, которые будут выглядеть намного аккуратнее:

Light-blur:

Light-sharpen:

Light-emboss:

Здесь стоит задаться вопросом, а как увеличивать силу эффекта? К сожалению, только многократным его наложением, поскольку как ни крути, а все равно обрабатывается область 3x3 пикселя. Естественно, это очень ресурсоемко, для получения размытия до пятен с помощью размытия по Гауссу иногда приходится накладывать фильтр 100-200 раз. Это занимает очень продолжительное время и очень много ресурсов.

В заключение

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

Матрица скручивания может быть успешна применена при:

  • создании "маленьких" картинок, напр. генерации аватаров и предпросмотров (особенно тут хорошо выглядит light-blur).
  • для создания "теней" (если бы еще с альфа-каналом:)
  • при создании CAPTHCA (текст + сильный Sharpen или Emboss)
  • и др. :-)

Создание симпатичной тени

    * Создает красивую тень

    * Внимание! Операция ресурсоемкая!

    * @param res $image - исходная картинка

    * @param int $shadow_width - толщина тени (1..10, выше не рекомендуется)

    * @param int $shadow_deep - глубина цвета тени (1..20, чем выше, тем чернее)

    * @param string $bg_color - цвет фона в формате #7def34

    function imageaddshadow (& $image , $shadow_width = 4 , $shadow_deep = 7 , $bg_color = false )

    $w = imagesx ($image ) ;

    $h = imagesy ($image ) ;

    $iw = $w + 4 * $shadow_width ;

    $ih = $h + 4 * $shadow_width ;

    $img = imagecreatetruecolor ($iw , $ih ) ;

    $shadow_deep = 255 - $shadow_deep * 12 ;

    $shadow = imagecolorallocate ($img , $shadow_deep , $shadow_deep , $shadow_deep ) ;

    if (! $bg_color ) {

    // Белый цвет по умолчанию

    $bg = imagecolorallocate ($img , 255 , 255 , 255 ) ;

    else {

    list ($r , $g , $b ) = array_map ("hexdec" , str_split (ltrim ($bg_color , "#" ) , 2 ) ) ;

    $bg = imagecolorallocate ($img , $r + 1 , $g + 1 , $b + 1 ) ;

    // Заливаем область цветом фона

    imagefilledrectangle ($img , 0 , 0 , $iw , $ih , $bg ) ;

    // Создаем тень

    imagefilledrectangle ($img ,

    1 + $shadow_width ,

    1 + $shadow_width ,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Результат линейной фильтрации для данного окна (для данного центрального пиксела) описывается следующей простой формулой:

$$ \begin{gather} \tag{1} \mbox{Im}" = \sum\limits_{i= -\textrm{hWinX}}^{\textrm{hWinX}}~\sum\limits_{j= -\textrm{hWinY}}^{\textrm{hWinY}} {\mbox{Im}\cdot \mbox{Mask}}, \end{gather} $$

где $\mbox{hWinX} = [\mbox{WinX}/2]$, $\mbox{hWinY} = [\mbox{WinY}/2]$ - полуширина и полувысота окна фильтрации соответственно (в случае окна $3\times 3$ обе величины равны 1).

Результат применения операции (1) ко всем пикселам изображения Im$$ называется $\it{сверткой}$ изображения Im с маской Mask.

Скользящее среднее в окне.

Простейшим видом линейной оконной фильтрации в пространственной области является \it{скользящее среднее} в окне. Результатом такой фильтрации является значение математического ожидания, вычисленное по всем пикселам окна. Математически это эквивалентно свертке с маской, все элементы которой равны $1/n$, где $n$ - число элементов маски. Например, маска скользящего среднего размера $3\times 3$ имеет вид

$$ \frac{1}{9}\times \begin{vmatrix} 1&1&1\cr 1&1&1\cr 1&1&1 \end{vmatrix}. $$

Рассмотрим пример фильтрации зашумленного полутонового изображения фильтром "скользяшее среднее". Изображения зашумлены гауссовским аддитивным шумом (рис. 2 - 8).

На рис. 1 - 6 приводятся примеры фильтрации полутонового изображения с различными степенями зашумления средним фильтром с размером окна $3\times 3$. Как видно из примера, фильтр "скользящее среднее" обладает меньшей способностью к подавлению шумовой компоненты по сравнению с ранее рассмотренным медианным фильтром $3\times 3$.

Рассмотрим скользящее среднее с большими размерами окна фильтрации. На рис. 23 - 28 приводится пример медианной фильтрации с различными размерами апертуры.

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

Гауссовская фильтрация.

В предыдущем разделе мы рассмотрели "вырожденный" случай линейной фильтрации с однородной маской. Между тем, сама идея свертки изображения с весовой матрицей аналогична ранее рассмотренной идее введения весовой матрицы во взвешенных процентильных фильтрах. Повысить устойчивость результатов фильтрации на краях областей можно, если придать более близким точкам окрестности большее влияние на окончательный результат, чем дальним. Примером реализации этой идеи для окна размера $3\times 3$ является маска

$$ \frac{1}{16}\times \begin{vmatrix} 1&2&1\cr 2&4&2\cr 1&2&1 \end{vmatrix}. $$

Такая маска называется гауссовой; соответственно, и использующий ее линейный фильтр также называется $\it{гауссовым}$. Используя дискретные приближения двумерной гауссовой функции, можно получить и другие гауссовы ядра большего размера. Обратите внимание на то, что $\it{сглаживающие}$ или $\it{фильтрующие}$ маски линейных фильтров должны иметь сумму всех элементов, равную $1$. Данное $\it{условие нормировки}$ гарантирует адекватный отклик фильтра на постоянный сигнал (постоянное изображение Im$ = \const$).

На рис. 13 - 15 приведен пример гауссовой линейной фильтрации зашумленного изображения.

ФИЛЬТРОВАНИЕ (от греч. phil"tron- любовный напиток; таковым считалось особо проз- б. м. э. т. хххш. рачное вино), один из способов отделения жидкой фазы от твердой (осадков, мути) путем пропускания системы через пористые материалы, задерживающие плотные частицы. От процеживания Ф. отличается применением более плотных пористых материалов: в профильтро-

Рисунок 1. Воронка с углом в 60° и складывание бумаги для фильтра Берцепиуса.

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

Ряс. 2.Рисунок 3.

Рисунок 2. Воронка со стеклянными палочками для ускорения фильтрования. Рисунок 3. Нуча: а-к васосу; б-для спуска фильтрата. товят для них фильтры Берцелиуса (рис. 1), особенно удобные в тех случаях, когда желательно собрать осадок. Для ускорения Ф. применяют граненые воронки (см. Воронка, рис. 8) или вставляют между стенками воронки и фильтром стеклянные палочки (рис. 2). На во-

Рисунок 4.

Рисунок 5. Рисунок 4. Дырчатые фарфоровые воронки. Рисунок 5. Плоенный (складчатый) фильтр Гей- Люссака. ронках Бюхнера (см. Воронка, рис. 3) и иучах (рис. 3), действующих при разрежении воздуха в приемнике, применяют плоские фильтры в виде кружочков соответствующей величины. Для ускорения Ф. в тех случаях, когда не требуется сохранения осадка, применяются воронки других форм (см. Воронка, рис. 1,2) и дырчатые воронки (рис. 4); для всех этих воронок готовят складчатые или плоенные фильтры Гей-Люссака, складывая для них бумагу веерообразно (рис. 5). Воронки с фильтрами должны применяться в штативах, во избежание переливания жидкости (рисунок 6); при Ф. непосредственно в склянку следует между горлышком склянки и воронкой закладывать нитку, бумажную полоску или стеклянную палочку, создавая таким образом щель для выхода воздуха. За последнее время у нас вырабатываются стеклянные фильтры с пористым стеклянным дном, через к-рые фильтруют без бумаги (рис. 7). Первой выпустила такие филыгры фабрика Шотта"в,Иене. Величина пор этих фильтров обозначается номерами: N° 1 пропускает еще частицы диаметром около 100 ц № 2-50 (I, К» 3-20 и № 4-5 ц. Чаще все." го применяющиеся формы этих стеклянных фильтров (Гослаборреактивсбыт) представлены на рис. 7; формы «д» и «е» служат для отсасывания жидкости от легко взмучиваемых осадков. Для облегчения фильтрования пользуются методами укрупнения осадков (напр. предварительным центрифугированием), понижения вязкости" жидкой фазы (фильтрование при нагреве,см. Воронка, рис. 10 и 11) или предварительно жидкость осветляют, вызывая в ней образование крупнозернистых осадков, увлекающих (адсорбирующих) мелкую муть. Для этой цели добавляют в осветляемую жидкость напр. взбитый в пену яичный белок, желатину, сыворотку (при наличии дубильных веществ),

Рисунок 6. Установки для фильтрования.

/

f=™*3j

Рисунок 7. Стеклянные пористые фильтры. молоко (к кислым жидкостям, напр. ягодным сокам) или же вскипяченные с водой обрывки фильтровальной бумаги, осветляющие глины (флоридин, гумбрин) и т. п.; иногда добавляют белки и затем свертывают их кипячением. Ф. через пористые свечи(Беркефельд, Шамберлан и др.)-см. Беркефелъ- gj* da свеча, Фильтры ^ в лаб. практике. - В производственном масштабе применяют методы Ф., допускающие большую производительность; гл. образом пользуются фильтрпрессами - аппаратами, изобретенными инж. Нидге-Рисунок 8. Детали фильтрпрес- момв 1828 г. (рис. 8). са и схема его действия: А- Для лабораторных жидкость; .Б-промой; В- /■ птттрчньгх ч пябот cv-ш.1Дкость; С-фильтрат. ^аптечных; pauoi оу ществуют малые фильтрпрессы. Большей производительностью обладают фильтры непрерывного действия, барабанные, дисковые и плоскостные (планфиль-тры). О фильтровании газов-см. Противогазы. - В капельном анализе (качественном микроанализе по Фейглю и Тананаеву) под Ф. подразумевают прохождение жидкости по ка-пилярам фильтровальной бумаги; «фильтратом» в этом смысле считается пятно жидкости на нек-ром расстоянии от капли, нанесенной на Какую-либо ТОЧКУ бумаги. И. Обергард*

Лучшие статьи по теме