Маска ядра при обнаружении угла Харриса - PullRequest
0 голосов
/ 12 мая 2018
// Convolution with horizontal differentiation kernel mask
float h = ((src[-srcStride + 1] + src[+1] + src[srcStride + 1]) -
          (src[-srcStride - 1] + src[-1] + src[srcStride - 1])) * 0.166666667f;

// Convolution vertical differentiation kernel mask
float v = ((src[+srcStride - 1] + src[+srcStride] + src[+srcStride + 1]) -
          (src[-srcStride - 1] + src[-srcStride] + src[-srcStride + 1])) * 0.166666667f;

Мне нужна теория для этого вида маски ядра, которая реализована в углу Харриса. Что это за маска ядра? Это prewitt или какое-то другое ядро? У меня есть трудности с поиском бумаги, которая может объяснить эту маску ядра

1 Ответ

0 голосов
/ 13 мая 2018

Это действительно оператор Prewitt .

После индексации в src (входное изображение) с srcStride числом элементов массива, которое нужно пропустить, чтобы обратиться к следующему соседу в y-директиве, можно увидеть, что h берет элементы из src в следующем порядке и со следующими весами:

-1/6   0   1/6
-1/6   0   1/6
-1/6   0   1/6

Это соответствует свертке со следующим ядром (помните, что свертка отражает ядро):

| 1  0  -1 |
| 1  0  -1 | / 6
| 1  0  -1 |

Это снова соответствует двум извилинам

h = src * ( [1 0 -1] / 2 ) * ( [1 1 1]^T / 3 )

То есть он применяет производный фильтр (центральную разность) по горизонтали и равномерный сглаживающий фильтр по вертикали.

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

...