Я знаю, что этот вопрос может быть не очень актуален для программирования, но если я не понимаю теорию обработки изображений, я никогда не смогу реализовать что-то на практике.
Если я правильно понял, фильтры Гаусса свернуты с изображением для уменьшения шума, так как они вычисляют средневзвешенное значение окрестности пикселя, и они очень полезны для обнаружения краев, поскольку вы можете применить размытие и получить изображение одновременно просто свертывается с производной гауссовской функции.
Но может ли кто-нибудь объяснить мне или дать некоторые рекомендации о том, как они рассчитываются?
Например , детектор краев Канни говорит о фильтре Гаусса 5x5, но как они получили эти конкретные числа? И как они прошли путь от непрерывной свертки до умножения матриц?
Ответы:
Чтобы эта операция работала, вам нужно представить, что ваше изображение преобразовано в вектор. Затем этот вектор умножается слева на матрицу свертки, чтобы получить размытое изображение. Обратите внимание, что результатом также является вектор того же размера, что и входные данные, то есть изображение того же размера.
Каждая строка матрицы свертки соответствует одному пикселю во входном изображении. Он содержит вес вкладов всех других пикселей в изображении в размытый аналог рассматриваемого пикселя.
Давайте рассмотрим пример: размытие рамки размером пикселя на изображении размером пикселей. Измененное изображение представляет собой столбец из 36 элементов, а матрица размытия имеет размер .3 × 3 6 × 6 36 × 36
Визуальную иллюстрацию тесно связанного процесса (свертка + вычитание) можно найти в этом посте (из моего личного блога).
источник
Для приложений к изображениям или сверточным сетям, чтобы более эффективно использовать матричные умножители в современных графических процессорах, входные данные обычно преобразуются в столбцы матрицы активации, которые затем можно умножать на несколько фильтров / ядер одновременно.
Проверьте эту ссылку из CS231n Стэнфорда и прокрутите вниз до раздела «Реализация как матричное умножение» для получения подробной информации.
Процесс работает, принимая все локальные исправления на входном изображении или карте активации, которые будут умножены на ядро, и растягивая их в столбец новой матрицы X с помощью операции, обычно называемой im2col. Ядра также растягиваются, чтобы заполнить строки весовой матрицы W, чтобы при выполнении матричной операции W * X полученная матрица Y имела все результаты свертки. Наконец, матрица Y должна быть снова изменена путем преобразования столбцов обратно в изображения с помощью операции, обычно называемой cal2im.
источник
Свертка во временной области равна матричному умножению в частотной области и наоборот.
Фильтрация эквивалентна свертке во временной области и, следовательно, умножению матриц в частотной области.
Что касается карт 5х5 или масок, то они исходят из дискретности операторов canny / sobel.
источник
Я написал функцию, которая решает эту проблему в моем репозитории StackOverflow Q2080835 GitHub (посмотрите
CreateImageConvMtx()
).На самом деле эта функция может поддерживать любую форму свертки вы хотите -
full
,same
иvalid
.Код выглядит следующим образом:
Я также создал функцию для создания матрицы для фильтрации изображений (идеи, аналогичные MATLAB
imfilter()
):Код был проверен на соответствие MATLAB
imfilter()
.Полный код доступен в моем хранилище StackOverflow Q2080835 GitHub .
источник