Как вы, возможно, знаете, операция свертка широко используется при обработке изображений.Он включает использование 2D-фильтра, обычно небольшого размера (например, 3x3 или 5x5), и краткое объяснение состоит в том, что вы накладываете фильтр на каждую позицию, умножаете значения в фильтре на значения в изображении и складываете все вместе.Страница wikipedia содержит более подробное описание этой операции.
Просто чтобы понять это, если у вас есть изображение MxN и фильтр UxV.Для каждого пикселя вы должны применить фильтр один раз.Поэтому вам нужно выполнить умножения и сложения M N U * V.
Некоторые фильтры имеют замечательное свойство, называемое отделимостью.Вы можете добиться того же эффекта 2D-фильтра UxV, применив один раз горизонтальный фильтр размера V, а затем вертикальный фильтр размера U. Теперь у вас есть M N U + M N V = M N (U + V) операций, поэтому это более эффективно.
sepFilter2D
делает именно это: применяет вертикальный и горизонтальный 1D-фильтр.Подпись полной функции:
void sepFilter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernelX, InputArray kernelY, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )
, где src
- исходное изображение, отфильтрованное изображение будет в dst
, ddepth
- требуемый типцелевое изображение, kernelX
и kernelY
- это горизонтальные и вертикальные 1D-ядра, которые я описал выше, anchor
представляет начало ядра (по умолчанию означает центр), delta
представляет значение, которое добавляется к целевому изображению для смещения егояркость и borderType
представляет метод, используемый вокруг границ.