logo

Geração de filtro gaussiano em C++

Filtragem Gaussiana é amplamente utilizado na área de processamento de imagens. É usado para reduzir o ruído de uma imagem. Neste artigo iremos gerar um Kernel Gaussiano 2D. O kernel gaussiano 2D segue a distribuição gaussiana fornecida abaixo. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Onde y é a distância ao longo do eixo vertical da origem, x é a distância ao longo do eixo horizontal da origem e ? é o desvio padrão.

O que é filtragem gaussiana?

Filtragem Gaussiana é uma técnica usada no processamento de imagens para suavizar imagens e reduzir ruído. Funciona aplicando um efeito de desfoque usando uma função matemática chamada função Gaussiana que dá mais peso aos pixels centrais e menos aos circundantes. Isso resulta em um desfoque de aparência natural que ajuda a remover detalhes indesejados, como granulação ou pequenos artefatos. A filtragem gaussiana é amplamente usada como uma etapa de pré-processamento em tarefas como detecção de bordas, reconhecimento de objetos e aprimoramento de imagens, tornando mais fácil para os algoritmos se concentrarem em recursos importantes.



Implementação em C++  

C++
// C++ program to generate Gaussian filter #include  #include    #include    using namespace std; // Function to create Gaussian filter void FilterCreation(double GKernel[][5]) {  // initialising standard deviation to 1.0  double sigma = 1.0;  double r s = 2.0 * sigma * sigma;  // sum is for normalization  double sum = 0.0;  // generating 5x5 kernel  for (int x = -2; x <= 2; x++) {  for (int y = -2; y <= 2; y++) {  r = sqrt(x * x + y * y);  GKernel[x + 2][y + 2] = (exp(-(r * r) / s)) / (M_PI * s);  sum += GKernel[x + 2][y + 2];  }  }  // normalising the Kernel  for (int i = 0; i < 5; ++i)  for (int j = 0; j < 5; ++j)  GKernel[i][j] /= sum; } // Driver program to test above function int main() {  double GKernel[5][5];  FilterCreation(GKernel);  for (int i = 0; i < 5; ++i) {  for (int j = 0; j < 5; ++j)  cout << GKernel[i][j] << 't';  cout << endl;  } } 

Saída: 

0.00296902 0.0133062 0.0219382 0.0133062 0.00296902   
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0219382 0.0983203 0.162103 0.0983203 0.0219382
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902 

Aplicações reais de filtragem gaussiana

Filtros gaussianos são usados ​​em muitas tecnologias cotidianas para melhorar a qualidade da imagem e extrair informações úteis :

  • Visão Computacional : ajuda a detectar bordas e formas, reduzindo o ruído antes de aplicar algoritmos de detecção.
  • Imagens Médicas : Usado para suavizar exames de ressonância magnética ou tomografia computadorizada, facilitando a identificação de tecidos e anormalidades.
  • Detecção de objetos : prepara imagens removendo distrações, permitindo que os modelos se concentrem nos principais recursos.
  • Ferramentas de edição de fotos : Comumente usado para aplicar efeitos de desfoque suavizar imagens ou reduzir a granulação para uma aparência mais limpa.

Comparação com outros filtros

Veja como Filtro gaussiano se destaca de outros filtros comuns:



  • Filtro de caixa (filtro médio) : Desfoca a imagem dando peso igual para todos os pixels circundantes. O filtro gaussiano é melhor porque fornece mais peso para centralizar pixels criando um desfoque mais suave e natural.
  • Filtro Mediano : Substitui cada pixel pelo mediana de valores próximos, o que é ótimo para remover barulho de sal e pimenta . Ao contrário do Gaussiano, ele não desfoca tanto a imagem, mas pode distorcer as bordas.
  • Filtro Bilateral : Como Gaussiano, mas também considera intensidade de pixels preservando diferenças bordas enquanto alisa. É mais avançado, mas também mais computacionalmente pesado .

Filtragem Gaussiana 2D vs 1D

UM Filtro gaussiano 2D pode ser dividido em dois filtros 1D — um horizontal e um vertical. Isso é chamado separabilidade e isso significa que não precisamos aplicar um kernel 2D completo de uma só vez.

Por que é importante:

Em vez de fazer cálculos pesados ​​com um grande kernel 2D (por exemplo, 5×5), aplicamos um Kernel 1D horizontalmente então o mesmo kernel verticalmente . Isto reduz o tempo de cálculo e dá ao mesmo resultado .

algoritmo kmp

Considerações de desempenho

Gerando e aplicando um Kernel gaussiano pode ser computacionalmente caro especialmente para imagens ou kernels grandes.



  • Complexidade de tempo :
    • Para um kernel de tamanho k × k aplicado a um n × n imagem a complexidade do tempo é O(n² × k²) .
    • Isso ocorre porque cada operação de pixel envolve um loop em todo o kernel.
  • Otimização – Filtros Separáveis :
    Os núcleos gaussianos são separável o que significa que um filtro 2D pode ser dividido em dois filtros 1D : um horizontal e um vertical.
    • Isso reduz a complexidade do tempo para O (n² × k) fazendo isso muito mais rápido para grãos maiores.

Usar filtros separáveis ​​é um truque comum em sistemas do mundo real para acelerar a filtragem gaussiana sem perder qualidade.

Deve ler

  • Aplicar um filtro Gauss a uma imagem com Python
  • Como gerar um array gaussiano 2-D usando NumPy?
  • Integração de funções gaussianas

Conclusão

A filtragem gaussiana é uma técnica simples, mas poderosa para reduzindo o ruído e o desfoque da imagem usando uma média ponderada suave baseada na função gaussiana. Neste artigo geramos um Kernel gaussiano 2D e explorou seu papel em vários aplicações do mundo real como imagens médicas de visão computacional e edição de fotos. Também o comparamos com outros filtros e discutimos maneiras de otimizar o desempenho usando filtros separáveis. A filtragem gaussiana geral é uma ferramenta fundamental no processamento de imagens ajudando a melhorar a qualidade da imagem e tornando mais fácil para os algoritmos se concentrarem em detalhes visuais importantes.