Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Подробности [ править ]

Общее выражение свертки:

где - отфильтрованное изображение, - исходное изображение, - ядро ​​фильтра. Каждый элемент ядра фильтра рассматривается с помощью и .


В зависимости от значений элементов ядро ​​может вызывать широкий спектр эффектов.

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

Происхождение [ править ]

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

Свертка [ править ]

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

Например, если у нас есть две матрицы размером три на три, первая - ядро, а вторая - изображение, свертка - это процесс переворачивания строк и столбцов ядра и умножения локально похожих записей и суммирования. Элемент в координатах [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 ++