Na convolução, duas funções matemáticas são combinadas para produzir uma terceira função. No processamento de imagens, as funções são geralmente chamadas de kernels. Um kernel nada mais é do que uma matriz (quadrada) de pixels (uma pequena imagem, por assim dizer). Geralmente, os valores no kernel somam um. Isso é para garantir que nenhuma energia seja adicionada ou removida da imagem após a operação.
Especificamente, um núcleo gaussiano (usado para desfoque gaussiano) é uma matriz quadrada de pixels em que os valores de pixel correspondem aos valores de uma curva gaussiana (em 2D).
Cada pixel da imagem é multiplicado pelo kernel gaussiano. Isso é feito colocando o pixel central do kernel no pixel da imagem e multiplicando os valores na imagem original pelos pixels no kernel que se sobrepõem. Os valores resultantes dessas multiplicações são somados e esse resultado é usado para o valor no pixel de destino. Olhando para a imagem, você multiplicaria o valor em (0,0) na matriz de entrada pelo valor em (i) na matriz do kernel, o valor em (1,0) na matriz de entrada pelo valor em (h ) na matriz do kernel e assim por diante. e adicione todos esses valores para obter o valor de (1,1) na imagem de saída.
Para responder sua segunda pergunta primeiro, quanto maior o kernel, mais cara será a operação. Portanto, quanto maior o raio do desfoque, mais longa será a operação.
Para responder à sua primeira pergunta, como explicado acima, a convolução pode ser feita multiplicando cada pixel de entrada com o kernel inteiro. No entanto, se o kernel for simétrico (que é um kernel gaussiano), você também poderá multiplicar cada eixo (x e y) independentemente, o que diminuirá o número total de multiplicações. Em termos matemáticos adequados, se uma matriz é separável, ela pode ser decomposta em matrizes (M × 1) e (1 × N). Para o kernel gaussiano acima, isso significa que você também pode usar os seguintes kernels:
1256⋅⎡⎣⎢⎢⎢⎢⎢⎢1464141624164624362464162416414641⎤⎦⎥⎥⎥⎥⎥⎥=1256⋅⎡⎣⎢⎢⎢⎢⎢⎢14641⎤⎦⎥⎥⎥⎥⎥⎥⋅[14641]
Agora você multiplicaria cada pixel na imagem de entrada com os dois núcleos e adicionaria os valores resultantes para obter o valor do pixel de saída.
Para mais informações sobre como ver se um kernel é separável, siga este link .
Editar: os dois núcleos mostrados acima usam valores ligeiramente diferentes. Isso ocorre porque o parâmetro (sigma) usado para a curva gaussiana para criar esses núcleos foi ligeiramente diferente nos dois casos. Para uma explicação sobre quais parâmetros influenciam a forma da curva gaussiana e, portanto, os valores no kernel seguem este link
Edit: na segunda imagem acima, diz que o kernel usado é invertido. Obviamente, isso só faz diferença se o kernel que você usa não é simétrico. A razão pela qual você precisa inverter o kernel tem a ver com as propriedades matemáticas da operação de convolução (consulte o link para obter uma explicação mais aprofundada sobre convolução). Simplificando: se você não inverter o kernel, o resultado da operação de convolução será invertido. Ao virar o kernel, você obtém o resultado correto.