При обработке изображений ядро , матрица свертки или маска представляют собой небольшую матрицу . Он используется для размытия, повышения резкости, тиснения, обнаружения краев и многого другого. Это достигается путем свертки между ядром и изображением .
Подробности [ править ]
Общее выражение свертки:
где - отфильтрованное изображение, - исходное изображение, - ядро фильтра. Каждый элемент ядра фильтра рассматривается с помощью и .
В зависимости от значений элементов ядро может вызывать широкий спектр эффектов.
Операция | Ядро ω | Результат изображения g (x, y) |
---|---|---|
Личность | ||
Обнаружение края | ||
Резкость | ||
Размытие рамки ( нормализованное ) | ||
Размытие по Гауссу 3 × 3 (приближение) | ||
Размытие по Гауссу 5 × 5 (приближение) | ||
Нерезкое маскирование 5 × 5 На основе размытия по Гауссу с величиной 1 и порогом 0 (без маски изображения ) |
Выше приведены лишь несколько примеров эффектов, достигаемых сверткой ядер и изображений.
Происхождение [ править ]
Начало координат - это позиция ядра, которая находится выше (концептуально) текущего выходного пикселя. Это может быть вне реального ядра, хотя обычно это соответствует одному из элементов ядра. Для симметричного ядра началом координат обычно является центральный элемент.
Свертка [ править ]
Свертка - это процесс добавления каждого элемента изображения к его локальным соседям, взвешиваемых ядром. Это связано с формой математической свертки . Выполняемая матричная операция - свертка - не является традиционным матричным умножением, несмотря на то, что она аналогичным образом обозначается *.
Например, если у нас есть две матрицы размером три на три, первая - ядро, а вторая - изображение, свертка - это процесс переворачивания строк и столбцов ядра и умножения локально похожих записей и суммирования. Элемент в координатах [2, 2] (то есть центральный элемент) результирующего изображения будет взвешенной комбинацией всех элементов матрицы изображения с весами, заданными ядром:
Остальные записи будут взвешены аналогичным образом, где мы помещаем центр ядра в каждую из граничных точек изображения и вычисляем взвешенную сумму.
Значения данного пикселя в выходном изображении вычисляются путем умножения каждого значения ядра на соответствующие значения пикселей входного изображения. Это можно описать алгоритмически с помощью следующего псевдокода:
для каждой строки изображения во входном изображении : для каждого пикселя в строке изображения : установить аккумулятор на ноль для каждой строки ядра в ядре : для каждого элемента в строке ядра : если позиция элемента соответствует * позиции пикселя, то умножить значение элемента, соответствующее * значению пикселя, добавить результат в аккумулятор endif установить пиксель выходного изображения в аккумулятор
- * соответствующие пиксели входного изображения находятся относительно исходной точки ядра.
Если ядро симметрично, поместите центр (начало координат) ядра в текущий пиксель. Ядро будет перекрывать соседние пиксели вокруг начала координат. Каждый элемент ядра должен быть умножен на значение пикселя, с которым он перекрывается, и все полученные значения должны быть суммированы. Эта результирующая сумма будет новым значением для текущего пикселя, который в настоящее время перекрывается центром ядра.
Если ядро не симметрично, его необходимо перевернуть как по горизонтальной, так и по вертикальной оси перед вычислением свертки, как указано выше. [1]
Общий вид свертки матриц:
Обработка кромок [ править ]
Свертка ядра обычно требует значений из пикселей за пределами границ изображения. Существует множество методов обработки краев изображения.
- Продлевать
- Пиксели ближайшей границы концептуально расширяются настолько, насколько это необходимо, чтобы обеспечить значения для свертки. Угловые пиксели расширены клиньями на 90 °. Остальные краевые пиксели растянуты линиями.
- Сворачивать
- Изображение концептуально обернуто (или мозаично), а значения берутся с противоположного края или угла.
- Зеркало
- Изображение концептуально зеркально отражено по краям. Например, при попытке прочитать 3 единицы пикселя за пределами края вместо этого считываются единицы на 3 единицы внутри края.
- Обрезать
- Любой пиксель в выходном изображении, для которого требуются значения за пределами края, пропускается. Этот метод может привести к тому, что выходное изображение будет немного меньше, а края будут обрезаны.
- Обрезка ядра
- Любой пиксель в ядре, выходящий за пределы входного изображения, не используется, и нормализация корректируется для компенсации.
Нормализация [ править ]
Нормализация определяется как деление каждого элемента ядра на сумму всех элементов ядра, так что сумма элементов нормализованного ядра равна единице. Это гарантирует, что средний пиксель измененного изображения будет таким же ярким, как средний пиксель исходного изображения.
Конкретная реализация [ править ]
Вот конкретная реализация свертки, выполненная с помощью языка затенения GLSL :
// автор: csblo // Работа сделана только после консультации: // https://en.wikipedia.org/wiki/Kernel_(image_processing)// Определение ядер #define identity mat3 (0, 0, 0, 0, 1, 0, 0, 0, 0) #define edge0 mat3 (1, 0, -1, 0, 0, 0, -1, 0, 1) #define edge1 mat3 (0, 1, 0, 1, -4, 1, 0, 1, 0) #define edge2 mat3 (-1, -1, -1, -1, 8, -1, -1 , -1, -1) #define sharpen mat3 (0, -1, 0, -1, 5, -1, 0, -1, 0) #define box_blur mat3 (1, 1, 1, 1, 1, 1 , 1, 1, 1) * 0.1111 #define gaussian_blur mat3 (1, 2, 1, 2, 4, 2, 1, 2, 1) * 0.0625 #define emboss mat3 (-2, -1, 0, -1, 1, 1, 0, 1, 2)// Находим координату элемента матрицы по индексу vec2 kpos ( int index ) { return vec2 [ 9 ] ( vec2 ( - 1 , - 1 ), vec2 ( 0 , - 1 ), vec2 ( 1 , - 1 ), vec2 ( - 1 , 0 ), vec2 ( 0 , 0 ), vec2 ( 1 , 0 ), vec2 ( - 1 , 1 ), vec2 ( 0 , 1 ), vec2 ( 1 , 1 ) ) [ индекс ] / iResolution . ху ; }// Извлечь область размерности 3x3 из сэмплера с центром в uv // sampler: texture sampler // uv: текущие координаты на сэмплере // return: массив mat3, каждый индекс соответствует цветному каналу mat3 [ 3 ] region3x3 ( sampler2D sampler , vec2 uv ) { // Создаем каждый пиксель для региона vec4 [ 9 ] region ; for ( int i = 0 ; i < 9 ; i ++ ) region [ i ] = texture ( sampler , uv + kpos ( i )); // Создаем область 3x3 с 3 цветовыми каналами (красный, зеленый, синий) mat3 [ 3 ] mRegion ; for ( int i = 0 ; i < 3 ; i ++ ) mRegion [ i ] = mat3 ( region [ 0 ] [ i ], region [ 1 ] [ i ], region [ 2 ] [ i ], region [ 3 ]) [ i ], регион [ 4 ] [ i ], регион [ 5 ] [ i ], регион [ 6 ] [ i ], регион [ 7 ] [ i ], регион [ 8 ] [ i ] ); return mRegion ; }// размывания текстуры с ядром // Ядро: ядро используется для свертки // пробник: текстуры Пробоотборника // уф: текущие координаты на пробоотборник vec3 свертки ( mat3 ядро , sampler2D пробник , vec2 уф ) { vec3 фрагмента ; // Извлекаем область 3x3 с центром в uv mat3 [ 3 ] region = region3x3 ( sampler , uv ); // для каждого цветового канала региона for ( int i = 0 ; i < 3 ; i ++ ) { // получить канал региона mat3 rc = region [ i ]; // компонент мудры умножение ядра по регионам канал mat3 с = matrixCompMult ( ядра , гс ); // добавляем каждый компонент матрицы float r = c [ 0 ] [ 0 ] + c [ 1] [ 0 ] + c [ 2 ] [ 0 ] + c [ 0 ] [ 1 ] + c [ 1 ] [ 1 ] + c [ 2 ] [ 1 ] + c [ 0 ] [ 2 ] + c [ 1 ] [ 2 ] + c [ 2 ] [ 2 ]; // для фрагмента на i-м канале установить result fragment [ i ] = r ; } вернуть фрагмент ; }void mainImage ( out vec4 fragColor , in vec2 fragCoord ) { // Нормализованные координаты пикселей (от 0 до 1) vec2 uv = fragCoord / iResolution . ху ; // размывания ядро с текстурой vec3 Col = свертка ( выбивают , iChannel0 , УФ ); // Вывод на экран fragColor = vec4 ( col , 1.0 ); }
Ссылки [ править ]
- Людвиг, Джейми (б. Свертка изображений (PDF) . Государственный университет Портленда .
- Лекарм, Оливье; Дельвар, Карин (январь 2013 г.). Книга GIMP: полное руководство практически ко всему . Пресс без крахмала . п. 429. ISBN. 978-1593273835.
- Гамстер, Джейсон ван; Шимонски, Роберт (март 2012). GIMP Библия . Вайли . С. 438–442. ISBN 978-0470523971.
- Шапиро, Линда Г .; Стокман, Джордж К. (февраль 2001 г.). Компьютерное зрение . Прентис Холл . С. 53–54. ISBN 978-0130307965.
Внешние ссылки [ править ]
- Реализация 2-мерной свертки на ПЛИС
- Руководство по программированию vImage: выполнение операций свертки
- Обработка изображений с использованием 2D-свертки
- Программа манипулирования изображениями GNU - Руководство пользователя - 8.2. Матрица свертки
- Интерактивная демонстрация ядер свертки 3x3
- GLSL Демонстрация ядер свертки 3x3
- Полный проект с открытым исходным кодом на C ++