In convoluzione, due funzioni matematiche sono combinate per produrre una terza funzione. Le funzioni di elaborazione delle immagini sono generalmente chiamate kernel. Un kernel non è altro che una matrice (quadrata) di pixel (una piccola immagine per così dire). Di solito, i valori nel kernel si sommano a uno. Questo per assicurarsi che non venga aggiunta o rimossa energia dall'immagine dopo l'operazione.
In particolare, un kernel gaussiano (usato per la sfocatura gaussiana) è una matrice quadrata di pixel in cui i valori dei pixel corrispondono ai valori di una curva gaussiana (in 2D).
Ogni pixel nell'immagine viene moltiplicato per il kernel gaussiano. Questo viene fatto posizionando il pixel centrale del kernel sul pixel dell'immagine e moltiplicando i valori nell'immagine originale con i pixel nel kernel che si sovrappongono. I valori risultanti da queste moltiplicazioni vengono sommati e quel risultato viene utilizzato per il valore nel pixel di destinazione. Guardando l'immagine, si moltiplicherebbe il valore in (0,0) nell'array di input per il valore in (i) nell'array del kernel, il valore in (1,0) nell'array in input per il valore in (h ) nell'array del kernel e così via. e quindi aggiungere tutti questi valori per ottenere il valore per (1,1) nell'immagine di output.
Per rispondere prima alla tua seconda domanda, più grande è il kernel, più costosa è l'operazione. Quindi, maggiore è il raggio della sfocatura, maggiore sarà il tempo necessario per l'operazione.
Per rispondere alla tua prima domanda, come spiegato sopra, la convoluzione può essere fatta moltiplicando ciascun pixel di input con l'intero kernel. Tuttavia, se il kernel è simmetrico (come è un kernel gaussiano), puoi anche moltiplicare ogni asse (xey) in modo indipendente, il che ridurrà il numero totale di moltiplicazioni. In termini matematici appropriati, se una matrice è separabile, può essere scomposta in matrici (M × 1) e (1 × N). Per il kernel gaussiano sopra questo significa che puoi anche usare i seguenti kernel:
1256⋅ ⎡⎣⎢⎢⎢⎢⎢⎢1464141624164624362464162416414641⎤⎦⎥⎥⎥⎥⎥⎥= 1256⋅⎡⎣⎢⎢⎢⎢⎢⎢14641⎤⎦⎥⎥⎥⎥⎥⎥⋅ [ 14641]
Ora moltiplicheresti ogni pixel nell'immagine di input con entrambi i kernel e aggiungeresti i valori risultanti per ottenere il valore per il pixel di output.
Per maggiori informazioni su come vedere se un kernel è separabile, segui questo link .
Modifica: i due kernel mostrati sopra usano valori leggermente diversi. Questo perché il parametro (sigma) utilizzato per la curva gaussiana per creare questi kernel era leggermente diverso in entrambi i casi. Per una spiegazione su quali parametri influenzano la forma della curva gaussiana e quindi i valori nel kernel seguono questo link
Modifica: nella seconda immagine sopra dice che il kernel che viene usato è capovolto. Questo ovviamente fa la differenza solo se il kernel che usi non è simmetrico. Il motivo per cui è necessario capovolgere il kernel ha a che fare con le proprietà matematiche dell'operazione di convoluzione (vedere il link per una spiegazione più approfondita sulla convoluzione). In poche parole: se non si gira il kernel, il risultato dell'operazione di convoluzione verrà capovolto. Lanciando il kernel, si ottiene il risultato corretto.