Почему свертка с ядрами работает?

Я не понимаю, как кто-то мог придумать простую матрицу 3x3 под названием kernel, поэтому при применении к изображению это произвело бы потрясающий эффект. Примеры: http://en.wikipedia.org/wiki/Kernel_(image_processing) . Почему это работает? Как люди придумали эти ядра (методом проб и ошибок?)? Можно ли доказать, что он всегда будет работать для всех изображений?

5 ответов


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

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

Я честно понятия не имею, что такое настоящая история, но это довольно правдоподобное объяснение.

надеюсь, что это помогает!


Я не понимаю, как кто-то мог придумать простую матрицу 3x3 под названием kernel, поэтому при применении к изображению это произвело бы потрясающий эффект. Примеры: http://en.wikipedia.org/wiki/Kernel_(image_processing).

Если вы хотите копаться в истории, Вам нужно будет проверить некоторые другие термины. В старых учебниках по обработке изображений то, что мы считаем ядрами сегодня, скорее всего, будет называться "операторы." Другой ключ термин свертка. Оба эти термина намекают на математическую основу ядер.

http://en.wikipedia.org/wiki/Convolution

вы можете прочитать о математической свертке в учебнике компьютерного зрения Балларда и Брауна. Книга датируется началом 80-х годов, но она все еще довольно полезна, и вы можете прочитать ее бесплатно online:

http://homepages.inf.ed.ac.uk/rbf/BOOKS/BANDB/toc.htm

из оглавления в Ballard и Brown book вы найдете ссылку на PDF для раздела 2.2.4 пространственные свойства.

http://homepages.inf.ed.ac.uk/rbf/BOOKS/BANDB/LIB/bandb2_2.pdf

в PDF прокрутите вниз до раздела " Теорема свертки.- Это дает математическую основу для свертки. Это относительно короткий шаг от мышления о свертке, выраженной в виде функций и интегралов, к применению тех же принципов к дискретному миру полутоновых (или цветных) данных в 2D-изображениях.

вы заметите, что ряд ядер / операторов связаны с именами: Sobel, Prewitt, Laplacian, Gaussian и т. д. Эти имена помогают предположить, что есть история-действительно довольно долгая история-математического развития и исследований обработки изображений, которые привели к большому количеству ядра сегодня широко используются.

оператор Пруитта (ядро), который очень похож на оператор Собеля, был опубликовано в 1970 году, если Википедия правильно.

http://en.wikipedia.org/wiki/Prewitt_operator

почему это работает?

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

тогда возникает вопрос, почему работают отдельные ядра. Ты смотришь на край, переход от тьмы к свету, в ... изображение, и если вы построите яркость пикселя на 2D-диаграмме рассеяния, вы заметите, что значения по оси Y быстро увеличиваются относительно краевого перехода на изображении. Этот краевой переход-наклон. Наклон можно найти, используя первую производную. Тада! Ядро, аппроксимирующее оператор первой производной, найдет ребра.

Если вы знаете, что в оптике есть такая вещь, как гауссово размытие, то вы можете задаться вопросом, как его можно применить к 2D-изображению. Таким образом, вывод Гауссовы ядра.

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

http://en.wikipedia.org/wiki/Laplacian


существует много математической теории о свертках, но примеры ядра, на которые вы ссылаетесь, просты для интуитивного объяснения:

[ 0  0  0]
[ 0  1  0]
[ 0  0  0]

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

[-1 -1 -1]
[-1  8 -1]
[-1 -1 -1]

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

[ 0  1  0]
[ 1 -4  1]
[ 0  1  0]

это похоже на приведенное выше, но настроено по-другому.

[ 0 -1  0]
[-1  5 -1]
[0  -1  0]

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

[ 1  2  1]
[ 2  4  2]
[ 1  2  1]

[ 1  1  1]
[ 1  1  1]
[ 1  1  1]

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


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

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

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

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

Как только у вас есть ядро, конечно, нет необходимости входить в частотную область вообще. Эта тяжелая работа закончена, концептуально и вычислительно. Свертка довольно дружелюбна ко всем участникам, и вы редко можете упростить ее дальше. Конечно, меньшие ядра дружелюбнее. Иногда большое ядро может быть выражено как свертка малых под-ядер, что является своего рода факторингом как в математике, так и в программном обеспечении обостренные чувства.

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


Я думаю, что лучший способ объяснить их-начать с 1d и обсудить Z-преобразование и его инверсии. Это переключается с временной области на частотную область-от описания волны как временной последовательности выборок до описания ее амплитуды каждой частоты, которая вносит в нее свой вклад. Два представления содержат одинаковый объем информации, они просто выражают ее по-разному.

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

вы можете сделать это, просто заставляя частоты, которые вы не хотите 0 - например, путем умножения всего диапазона на определенную маску, где 1 - это частота, которую вы хотите сохранить и 0 - это частота, которую вы хотите устранить.

но что, если вы хотите сделать что во временной области? Вы можете перенести в частотную область, применить маску, а затем преобразовать обратно. Но это большая работа. Итак, что вы делаете (приблизительно) сделать маску из частотной области во временную область. Затем вы можете применить его во временной области.

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

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