Документация Engee

conv2

Страница в процессе разработки.

Двумерная свертка.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • C = conv2(A,B) — возвращает двумерную свертку матриц A и B.

    • Если A — матрица, а B — вектор-строка (или A — вектор-строка, а B — матрица), то C — это свертка каждой строки матрицы с вектором.

    • Если A — матрица, а B — вектор-столбец (или A — вектор-столбец, а B — матрица), то C — это свертка каждого столбца матрицы с вектором.

  • C = conv2(u,v,A) — сначала свертывает каждый столбец матрицы A с вектором u, а затем каждую строку результата с вектором v. Это поведение применяется независимо от того, является ли u или v вектором-строкой или вектором-столбцом.

  • C = conv2(___,shape) — возвращает часть свертки в соответствии с заданной формой. Например, C = conv2(A,B,"same") возвращает центральную часть свертки, которая имеет тот же размер, что и A.

Аргументы

Входные аргументы

# A — входной массив
вектор | матрица

Details

Входной массив, заданный как вектор или матрица.

Типы данных

Float64, Float32, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Bool

Поддержка комплексных чисел

Да

# B — второй входной массив
вектор | матрица

Details

Второй входной массив, заданный как вектор или матрица для свертки с массивом A. Массив B может быть не того же размера, что и A.

Типы данных

Float64, Float32, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Bool

Поддержка комплексных чисел

Да

# u — входной вектор
вектор-строка | вектор-столбец

Details

Входной вектор, заданный как вектор-строка или вектор-столбец. u выполняет свертку с каждым столбцом матрицы A.

Типы данных

Float64, Float32, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Bool

Поддержка комплексных чисел

Да

# v — второй входной вектор
вектор-строка | вектор-столбец

Details

Второй входной вектор, заданный как вектор-строка или вектор-столбец. v выполняет свертку с каждой строкой свертки вектора u со столбцами матрицы A.

Типы данных

Float64, Float32, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Bool

Поддержка комплексных чисел

Да

# shape — участок свертки
"full" (по умолчанию) | "same" | "valid"

Details

Участок свертки, задаваемый одним из следующих значений:

  • "full" — возвращает полную двумерную свертку.

  • "same" — возвращает центральную часть свертки, того же размера, что и исходная матрица A.

  • "valid" — возвращает только ту часть свертки, которая вычислена без дополнения нулями.

Выходные аргументы

# C — двумерная свертка
вектор | матрица

Details

Двумерная свертка, возвращаемая в виде вектора или матрицы. Если A и B — матрицы, то свертка C = conv2(A,B) имеет размер size(A)+size(B)-1. Если m,n = size(A), p = length(u) и q = length(v), то свертка C = conv2(u,v,A) имеет m+p-1 строк и n+q-1 столбцов.

Если один или несколько входных аргументов функции conv2 имеют тип Float32, то выходной аргумент будет иметь тип Float32. В противном случае conv2 преобразует входные данные в тип Float64 и возвращает тип Float64.

Типы данных

Float64, Float32

Примеры

Двумерная свертка

Details

Бывает полезно сравнивать входные данные свертки непосредственно с выходными. Функция conv2 позволяет контролировать размер выходных данных.

Создадим случайные матрицы A размером и B размером . Вычислим полную свертку A и B, которая представляет собой матрицу размером .

import EngeeDSP.Functions: conv2

A = rand(3, 3)
B = rand(4, 4)
Cfull = conv2(A, B)
6×6 Matrix{Float64}:
 0.192995   0.882682  0.775044  0.405206  0.103599  0.0162149
 0.097371   1.17042   1.53107   1.55316   0.520306  0.126147
 0.441852   1.15874   1.98734   3.1404    1.30511   0.484233
 0.27297    0.973765  1.87607   2.67335   1.76588   1.15007
 0.245543   0.433698  1.24257   1.63366   1.89067   1.4068
 0.0713151  0.203243  0.630603  0.901696  1.01698   0.577671

Вычислим центральную часть свертки Csame, которая является подматрицей Cfull того же размера, что и A. Csame равна Cfull[3:5, 3:5].

Csame = conv2(A, B, "same")
3×3 Matrix{Float64}:
 1.98734   3.1404    1.30511
 1.87607   2.67335   1.76588
 1.24257   1.63366   1.89067

Извлечение ребер двумерного пьедестала

Details

Алгоритм поиска ребер Собеля использует двумерную свертку для обнаружения ребер на изображениях и других двумерных данных.

Создадим и построим двумерный пьедестал с внутренней высотой, равной единице.

A = zeros(10, 10)
A[3:7, 3:7] .= 1.0
surface(A)

conv2 pedestal

Выполним свертку строк матрицы A с вектором u, а затем — свертку строки результата с вектором v. Свертка извлечет горизонтальные края пьедестала.

import EngeeDSP.Functions: conv2

u = [1, 0, -1]'
v = [1, 2, 1]
Ch = conv2(u, v, A)
surface(Ch)

conv2 pedestal 1

Чтобы извлечь вертикальные края пьедестала, поменяем порядок свертки с u и v на обратный.

Cv = conv2(v, u, A)
surface(Cv)

conv2 pedestal 2

Вычислим и нанесем на график объединенные края пьедестала.

surface(sqrt.(Ch.^2 .+ Cv.^2))

conv2 pedestal 3

Дополнительно

Двумерная свертка

Details

Для дискретных двумерных матриц и следующее уравнение определяет свертку и :

и пробегают все значения, которые приводят к допустимым индексам и .

Используя это определение, функция conv2 вычисляет прямую свертку двух матриц, а не свертку на основе БПФ.