Матрица свертки при размытии движения с учетом угла и величины
У меня есть Java-код, который принимает матрицу свертки (просто 2D double[][]
) и применяет его к изображению. Я пытаюсь выяснить, как создать матрицу, которая даст размытие при движении, учитывая угол (в градусах) и величину размытия.
Пример матрицы для размытия с величиной = 1 (средний пиксель размыт на один пиксель в каждом направлении), 45-градусное размытие движения:
0 0 1/3
0 1/3 0
1/3 0 0
Величина определяет размер матрицы (размер = 2* величина + 1), и одна линия ячеек отлична от нуля в направлении движения.
У меня проблемы с математикой / кодом, необходимыми для определения, какие ячейки должны иметь ненулевое значение в матрице с учетом угла.
Псевдо (или фактический) код был бы чрезвычайно полезен!
1 ответ
В Matlab и Octave есть встроенная функция под названием "fspecial" для создания ядер для свертки. Передав флаг "движение" вместе с величиной и углом, он выведет конституционное ядро (матрицу), которое вы можете использовать для применения размытия движения к вашему изображению. https://octave.sourceforge.io/image/function/fspecial.html
К сожалению, похоже, что на других языках нет такой функции, которую я все равно могу найти для создания этого ядра. Лучшее, что я могу придумать, - это преобразовать угол и величину в начальную и конечную (x,y) точки линии. Затем вы можете нарисовать полутоновую линию со сглаживанием, используя алгоритм Xiaolin Wu https://rosettacode.org/wiki/Xiaolin_Wu%27s_line_algorithm
Вам нужно будет разделить все элементы на сумму элементов, чтобы гарантировать, что ядро нормализовано, прежде чем свертить его с вашим изображением.
Для размытия в движении ненулевые элементы показывают, что все лежат вдоль одной линии. Вот почему ваш пример работает. [1/n 1/n (ntimes)... 1/n] будет размыто в горизонтальном направлении, в то время как транспонирование будет размыто вертикально. Для произвольного угла просто заполните ненулевые элементы, которые наилучшим образом аппроксимируют линию под нужным углом.
редактировать.
Например, вы можете попытаться минимизировать некоторую функцию индексов пикселей, чтобы определить, должен ли этот пиксель быть ненулевым. |(i - 3*j)|