Матричные фильтры обработки изображений

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



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



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

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

Применение матрицы свёртки

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

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

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


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

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

Пример матрицы для фильтра размытия

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

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

Пример фильтра размытия

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

Проблема граничных условий

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

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

Решение 1 для граничных условий

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

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

Решение 1 для граничных условий

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

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

Gimp фильтр

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

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



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

Пример использования медианного фильтра

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

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

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

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

Алгоритм медианного фильтра

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



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

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

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

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

Матрица для фильтров эрозия и наращивание

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

Заключение



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

ru.wikipedia.org/wiki/Медианный_фильтр
www.mathworks.com/help/toolbox/images/f18-12508.html#f18-20972
ru.wikipedia.org/wiki/Математическая_морфология
habrahabr.ru/post/43895
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 26

    +2
    Разве такая же статья не была уже на хабре?
      0
      Не могу найти, но помню, о матричных фильтрах была
        +1
        Может быть вы имели ввиду статью: habrahabr.ru/post/43895/
        Но эта статья немного другая, хотя и по близкой тематики.
          0
          Да, действительно, она. Теперь вижу разницу.
          0
          Была похожая, но про те же нейронные сети целая гора статей на хабре и ничего =)
          А вообще эта статья кажется очень даже годная
            0
            Спасибо, я старался.
        0
        Подобной статьи я не нашёл, поэтому решил опубликовать. Я видел статью «Графические фильтры на основе матрицы скручивания», но она рассказывает только про фильтры на основе матрицы скручивания.
          0
          Звучит интересно, но ведь это самые основы. Такая статья хорошо смотрелась бы как начало цикла статей.
            –1
            Возможно я продолжу публиковать статьи о обработке изображений, так как на русском языке такой информации не много.
              +3
              Господа, прочтите классику.

              Прэтт Уильям. Цифровая обработка изображений
              Количество страниц: 781стр.
              Формат:djvu.
              Издательство «Мир», Москва, 1982г.
                0
                Еще добавлю Гонсалеса и Вудса. Вот уж где кладезь теории обработки изображений…
                  0
                  ;)
                  см. мой комментарий к самому топику.
                  Ссылка на оригинального. Я, даже не обращал внимания, что есть перевод на русский.

                  Гонзалез и Вуд, оригинале, залит на смарфон, читаю в пробках ;)
            +2
            А я поставил минус.

            Откуда такая терминология?
            В классический трудах по обработке изображений введено понятие «свертка».
            Это есть взвешенный перевод термина convolution with matrix.

            Digital Image Processing, William K. Pratt
            Publication Date: April 1991 | ISBN-10: 0471857661 | ISBN-13: 978-0471857662 | Edition: 2

            Digital Image Processing 2Ed, Gonzalez and Woods
            Prentice Hall | ISBN 0201180758 | 2002 Year
              0
              Не могли бы вы подробнее написать, какая именно терминология вам показалась не правильной?
                +2
                «Матричные фильтры» — какой-то провинциальный новодел
                Всегда существовал термин «свертка с окном»

                «второй метод» — из вашей статьи, называется аподизация(apodisation), дополнение.
                  0
                  Спасибо.

                  Насчёт второго, добавлю.
              +3
              Кстати, по теме. На этой неделе стартовал 10-недельный курс: Computer Vision: The Fundamentals
                0
                Спасибо!
                Пропустил, что этот курс начался
                0
                Мне понравилась ваша фраза: «Статья ориентирована, прежде всего, на программистов, занимающихся обработкой изображений.» Хоть бы код какой-нибудь привели.
                  +1
                  а есть смысл? код же ну очень простой и безыдейный.
                    0
                    Если приводить код, статья раздулась бы раз в 10 (разве что если бы код был на Matlab/Octave, он занял бы мало места, но это уже не программирование). Одну только свертку можно выполнять «в лоб» (если матрицы небольшие), а можно через преобразование Фурье (что дает хороший выигрыш в производительности, но требует много ресурсов — на GPU так не посчитать).
                    Хотя, конечно, можно было бы псевдокод использовать…
                      0
                      Быстрое преобразование Фурье считается элементарно даже на втором Пентиуме. Для изучения основ на мой взгляд лучше всего подходит Processing. Вот код функции свертки.

                      color convolution(int x, int y, float[][] matrix,int matrixsize, PImage img)
                      {
                        float rtotal = 0.0;
                        float gtotal = 0.0;
                        float btotal = 0.0;
                        int offset = matrixsize / 2;
                        for (int i = 0; i < matrixsize; i++){
                          for (int j= 0; j < matrixsize; j++){
                            // What pixel are we testing
                            int xloc = x+i-offset;
                            int yloc = y+j-offset;
                            int loc = xloc + img.width*yloc;
                            // Make sure we haven't walked off our image, we could do better here
                            loc = constrain(loc,0,img.pixels.length-1);
                            // Calculate the convolution
                            rtotal += (red(img.pixels[loc]) * matrix[i][j]);
                            gtotal += (green(img.pixels[loc]) * matrix[i][j]);
                            btotal += (blue(img.pixels[loc]) * matrix[i][j]);
                          }
                        }
                        // Make sure RGB is within range
                        rtotal = constrain(rtotal,0,255);
                        gtotal = constrain(gtotal,0,255);
                        btotal = constrain(btotal,0,255);
                        // Return the resulting color
                        return color(rtotal,gtotal,btotal);
                      }
                      
                        0
                        хм… Давно хотел реализовать SURF на плис, но ресурсов для свёртки маловато. что-то я и забыл про свёртку через Фурье
                      +1
                      за Лену плюс, но статья все-таки для тех кто еще не занимается обработкой изображений, но интересуется.
                        +6
                        Можете объяснить чем линейный фильтр отличается от нелинейного? Почему вы пишете «можно разделить на 2 фильтра» вместо «сепарабельный фильтр»? А знаете как апертура фильтра Гаусса связана с СКО(сигма)?
                        Про морфологические операции вообще куцо написали. Чем Ваша статья выделяется на фоне книги Гонсалеса?
                        Извините, но ИМХО статья не соответствует вступительным словам.

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

                        Самое читаемое