Матрица свертки размытия движения с учетом угла и величины

У меня есть код Java, который берет матрицу свертки (просто 2D double[][]) и применяет ее к изображению. Я пытаюсь понять, как создать матрицу, которая будет давать размытие в движении, учитывая угол (в градусах) и величину размытия.

Пример матрицы для размытия с величиной = 1 (средний пиксель размыт на один пиксель в каждом направлении), размытие движения 45 градусов:

0      0    1/3
0     1/3    0
1/3    0     0

Величина определяет размер матрицы (размер = 2*величина + 1), а одна строка ячеек не равна нулю в направлении движения.

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

Псевдокод (или настоящий) был бы очень полезен!


person scaevity    schedule 22.03.2013    source источник


Ответы (2)


Для размытия в движении ненулевые элементы показывают, что все они лежат вдоль одной линии. Вот почему ваш пример работает. [1/n 1/n (ntimes)... 1/n] будет размывать по горизонтали, а транспонирование будет размывать по вертикали. Для произвольного угла просто заполните ненулевые элементы, которые лучше всего аппроксимируют линию под нужным вам углом.

изменить

Например, вы можете попытаться минимизировать некоторую функцию индексов пикселей, чтобы определить, должен ли этот пиксель быть ненулевым. |(i - 3*j)| ‹ малое число, найдет пиксели вдоль линии наклона 3.

person bogle    schedule 22.03.2013
comment
Да, я понимаю это. Чего я не знаю, так это выяснить, какие ячейки лучше всего аппроксимируют линию под заданным углом. - person scaevity; 23.03.2013
comment
ааа, извините. исправил мой ответ эвристическим решением. - person bogle; 23.03.2013
comment
@scaevity Вы нашли решение проблемы? - person zanbri; 24.08.2017

В Matlab и Octave есть встроенная функция fspecial для создания ядер для свертки. Передавая флаг «движение» вместе с величиной и углом, он выводит конституционное ядро ​​(матрицу), которое вы можете использовать для применения размытия движения к вашему изображению. https://octave.sourceforge.io/image/function/fspecial.html

К сожалению, в других языках нет такой функции, которую я все равно могу найти для создания этого ядра. Лучшее, что я могу придумать, это преобразовать угол и величину в начальную и конечную (x, y) точки линии. Затем вы можете нарисовать линию в оттенках серого со сглаживанием, используя алгоритм Xiaolin Wu https://rosettacode.org/wiki/Xiaolin_Wu%27s_line_algorithm

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

person Diarmaid O Cualain    schedule 10.07.2020