Konvoluce

Konvoluce dvou signálů: obdélníkového pulsu a impulsní charakteristika RC článku. Výsledkem konvoluce je odezva RC článku na obdélníkový puls.

Konvoluce je matematický operátor zpracovávající dvě funkce.

Spojitá konvoluce (značí se hvězdičkou) jednorozměrných funkcí f ( x ) {\displaystyle f(x)} a g ( x ) {\displaystyle g(x)} je definována vztahem:

( f g ) ( x ) = f ( α ) g ( x α ) d α {\displaystyle (f*g)(x)=\int _{-\infty }^{\infty }f(\alpha )g(x-\alpha )\,\mathrm {d} \alpha }

Funkci g ( x ) {\displaystyle g(x)} se říká konvoluční jádro. Hodnota konvoluce funkce f {\displaystyle f} s jádrem g {\displaystyle g} v bodě x {\displaystyle x} je integrál ze součinu funkce f {\displaystyle f} s otočenou funkcí konvolučního jádra (integrační proměnná α {\displaystyle \alpha } má v argumentu konvolučního jádra g ( x α ) {\displaystyle g(x-\alpha )} záporné znaménko) posunutou do bodu x {\displaystyle x} .

Pokud jde o konvoluci při zpracovávání obrazu, je funkce f ( x ) {\displaystyle f(x)} většinou zkoumaný obrázek a funkce g ( x ) {\displaystyle g(x)} nějaký filtr.

Vlastnosti konvoluce

Komutativní

f g = g f {\displaystyle f*g=g*f\,}

Asociativní

f ( g h ) = ( f g ) h {\displaystyle f*(g*h)=(f*g)*h\,}

Distributivní

f ( g + h ) = ( f g ) + ( f h ) {\displaystyle f*(g+h)=(f*g)+(f*h)\,}

Existence jednotky

f δ = δ f = f {\displaystyle f*\delta =\delta *f=f\,}

kde δ je tzv. Diracova delta funkce (distribuce):

δ ( x ) = 0 , x 0 {\displaystyle \delta (x)=0,x\neq 0}

a δ ( 0 ) := + {\displaystyle \delta (0):=+\infty } . Integrál Delta funkce je roven 1:

δ ( x ) d x = 1. {\displaystyle \int _{-\infty }^{\infty }\delta (x)\,\mathrm {d} x=1.}

Jde tedy o puls trvající nekonečně krátkou dobu.

Asociativita při násobení skalárem

a ( f g ) = ( a f ) g = f ( a g ) {\displaystyle a(f*g)=(af)*g=f*(ag)\,}

pro všechna reálná (nebo komplexní) čísla a {\displaystyle a} .

Konvoluční teorém

F ( f g ) = [ F ( f ) ] [ F ( g ) ] = F G {\displaystyle {\mathcal {F}}(f*g)=\left[{\mathcal {F}}(f)\right]\cdot \left[{\mathcal {F}}(g)\right]=F\cdot G}

kde F ( f ) {\displaystyle {\mathcal {F}}(f)\,} značí Fourierovu transformaci f {\displaystyle f\,}

F [ f ( x ) ] F ( k ) f ( x ) exp ( 2 π i k x ) d x {\displaystyle {\mathcal {F}}\left[f(x)\right]\equiv F(k)\equiv \int _{-\infty }^{\infty }f(x)\exp(-2\pi ikx)\,\mathrm {d} x}

Dk.:

F ( k ) = f ( x ) exp ( 2 π i k x ) d x {\displaystyle F(k)=\int _{-\infty }^{\infty }f(x)\exp(-2\pi ikx)\,\mathrm {d} x}
G ( k ) = g ( x ) exp ( 2 π i k x ) d x {\displaystyle G(k)=\int _{-\infty }^{\infty }g(x)\exp(-2\pi ikx)\,\mathrm {d} x}
h ( z ) = f ( x ) g ( z x ) d x {\displaystyle h(z)=\int _{-\infty }^{\infty }f(x)g(z-x)\,\mathrm {d} x}
H ( k ) = h ( z ) exp ( 2 π i k z ) d z = [ f ( x ) g ( z x ) d x ] exp ( 2 π i k z ) d z = {\displaystyle H(k)=\int _{-\infty }^{\infty }h(z)\exp(-2\pi ikz)\,\mathrm {d} z=\int _{-\infty }^{\infty }\left[\int _{-\infty }^{\infty }f(x)g(z-x)dx\right]\exp(-2\pi ikz)\,\mathrm {d} z=}
= f ( x ) [ g ( z x ) exp ( 2 π i k z ) d z ] d x = {\displaystyle =\int _{-\infty }^{\infty }f(x)\left[\int _{-\infty }^{\infty }g(z-x)\exp(-2\pi ikz)\,\mathrm {d} z\right]\mathrm {d} x=}

substituce: y = z x {\displaystyle y=z-x\,} a tedy d y = d z {\displaystyle \mathrm {d} y=\mathrm {d} z\,}

= f ( x ) [ g ( y ) exp ( 2 π i k ( y + x ) ) d y ] d x = {\displaystyle =\int _{-\infty }^{\infty }f(x)\left[\int _{-\infty }^{\infty }g(y)\exp(-2\pi ik(y+x))\,\mathrm {d} y\right]\mathrm {d} x=}
= f ( x ) exp ( 2 π i k x ) d x g ( y ) exp ( 2 π i k y ) d y = F ( k ) G ( k ) {\displaystyle =\int _{-\infty }^{\infty }f(x)\exp(-2\pi ikx)\,\mathrm {d} x\cdot \int _{-\infty }^{\infty }g(y)\exp(-2\pi iky)\,\mathrm {d} y=F(k)\cdot G(k)}

Diskrétní konvoluce

( f g ) k   = d e f   i = f i g k i {\displaystyle (f*g)_{k}\ {\stackrel {\mathrm {def} }{=}}\ \sum _{i=-\infty }^{\infty }f_{i}\cdot g_{k-i}}
= i = f k i g i {\displaystyle =\sum _{i=-\infty }^{\infty }f_{k-i}\cdot g_{i}}

Příklad

V případě dvou konečných řad se samozřejmě nesčítá od −∞ do +∞, ale pouze přes existující prvky. (Případně si lze na pozici neexistujících prvků řady představit nuly.) Výsledná řada je o jeden prvek kratší než je součet délek konvoluovaných řad.

Konvoluce dvou řad:

(a, b, c, d) * (e, f, g) =
= (a*e) (a*f) (a*g)
        (b*e) (b*f) (b*g)
              (c*e) (c*f) (c*g) 
                    (d*e) (d*f) (d*g)
  -----------------------------------
  následuje sečtení pod sebou

Výsledek je stejný, jakoby se jednalo o součin dvou polynomů. (Koeficienty násobených polynomů by představovaly dvě konvoluované řady, koeficienty součinu polynomů by odpovídaly výsledku konvoluce.)

Konkrétní čísla:

(1, 2, -2, -1) * (1, -1, 2) =
= 1 -1  2
     2 -2  4
       -2  2 -4
          -1  1 -2
 ------------------
 (1, 1,-2, 5,-3,-2)

Jinou možností výpočtu je použití maticového násobení.

[ a b c d ] [ e f g ] = [ a b c d ] [ e f g 0 0 0 0 e f g 0 0 0 0 e f g 0 0 0 0 e f g ] {\displaystyle {\begin{bmatrix}a&b&c&d\end{bmatrix}}*{\begin{bmatrix}e&f&g\end{bmatrix}}={\begin{bmatrix}a&b&c&d\end{bmatrix}}{\begin{bmatrix}e&f&g&0&0&0\\0&e&f&g&0&0\\0&0&e&f&g&0\\0&0&0&e&f&g\end{bmatrix}}}

Konkrétní čísla:

[ 1 2 2 1 ] [ 1 1 2 ] = [ 1 2 2 1 ] [ 1 1 2 0 0 0 0 1 1 2 0 0 0 0 1 1 2 0 0 0 0 1 1 2 ] = [ 1 1 2 5 3 2 ] {\displaystyle {\begin{bmatrix}1&2&-2&-1\end{bmatrix}}*{\begin{bmatrix}1&-1&2\end{bmatrix}}={\begin{bmatrix}1&2&-2&-1\end{bmatrix}}{\begin{bmatrix}1&-1&2&0&0&0\\0&1&-1&2&0&0\\0&0&1&-1&2&0\\0&0&0&1&-1&2\end{bmatrix}}={\begin{bmatrix}1&1&-2&5&-3&-2\end{bmatrix}}}

Využití v počítačové grafice

Konvoluce se často používá při algoritmech zpracování dvourozměrného diskrétního obrazu v počítačové grafice. Vzorec diskrétní konvoluce má potom tvar:

( f h ) ( x , y ) = i = k k j = k k f ( x i , y j ) h ( i , j ) {\displaystyle (f*h)(x,y)=\sum _{i=-k}^{k}\sum _{j=-k}^{k}f(x-i,y-j)\cdot h(i,j)}

Princip diskrétní dvourozměrné konvoluce

V případě diskrétní konvoluce lze jádro chápat jako tabulku (konvoluční maska), kterou položíme na příslušné místo obrazu. Každý pixel překrytý tabulkou vynásobíme koeficientem v příslušné buňce a provedeme součet všech těchto hodnot. Tím dostaneme jeden nový pixel.

Například mějme konvoluční masku o rozměru 3×3 (bude překryto 9 pixelů) a všechny buňky mají koeficient 0,111 (1/9). Nový pixel, který vypočteme po aplikaci na jedno místo v původním obraze, tedy bude průměrem z devíti okolních pixelů. Neudělali jsme totiž nic jiného, než že jsme sečetli hodnoty 9 pixelů a vydělili 9. Pokud aplikujeme konvoluci na celý obraz, pak dostaneme rozostřený obraz. Pokud použijeme větší konvoluční masku 5×5 s koeficienty 1/25, pak bude obraz rozostřen více.

Koeficienty uvnitř konvoluční masky udávají vliv hodnoty pixelu pod nimi. Lze tak nadefinovat velké množství operací, např. derivace obrazu (u diskrétního obrazu mluvíme o tzv. odhadu derivace), tedy zvýraznění hran (viz detekce hran).

Externí odkazy