Tuesday 15 August 2017

Moving Average Opencv


Imagens de suavização Aprenda a: Desligar imagens com vários filtros de passagem baixa Aplicar filtros personalizados nas imagens (convolução 2D) Convolução 2D (Filtragem de imagem) Quanto aos sinais unidimensionais, as imagens também podem ser filtradas com vários filtros de passagem baixa (LPF) , Filtros de passagem alta (HPF), etc. Um LPF ajuda na remoção de ruído ou na imagem desfocada. Um filtro HPF ajuda a encontrar bordas em uma imagem. OpenCV fornece uma função, cv2.filter2D (). Para transformar um kernel com uma imagem. Como exemplo, tentaremos um filtro de média em uma imagem. Um kernel de filtro de média de 5x5 pode ser definido da seguinte maneira: a filtragem com o núcleo acima resulta na seguinte execução: para cada pixel, uma janela 5x5 está centrada neste pixel, todos os pixels que se enquadram nesta janela são resumidos e o resultado é Então dividido por 25. Isso equivale a calcular a média dos valores de pixels dentro dessa janela. Esta operação é executada para todos os pixels na imagem para produzir a imagem filtrada de saída. Experimente este código e verifique o resultado: Borrão da imagem (Suavização de imagem) A imagem desfocada é conseguida convolvendo a imagem com um kernel de filtro de passagem baixa. É útil para remover o ruído. Ele realmente remove o conteúdo de alta freqüência (por exemplo: ruído, bordas) da imagem, resultando em bordas embaçadas quando este é um filtro aplicado. (Bem, existem técnicas de desfocagem que não desfocam bordas). OpenCV fornece principalmente quatro tipos de técnicas de desfocagem. 1. Averaging Isso é feito convolvendo a imagem com um filtro de caixa normalizado. Ele simplesmente leva a média de todos os pixels na área do kernel e substitui o elemento central por essa média. Isso é feito pela função cv2.blur () ou cv2.boxFilter (). Verifique os documentos para obter mais detalhes sobre o kernel. Devemos especificar a largura e a altura do kernel. Um filtro de caixa normalizado de 3x3 ficaria assim: se você não quiser usar um filtro de caixa normalizado, use cv2.boxFilter () e passe o argumento normalizeFalse para a função. Verifique a demonstração da amostra abaixo com um kernel de tamanho 5x5: 2. Filtragem Gaussiana Nesta abordagem, em vez de um filtro de caixa consistindo em coeficientes de filtro iguais, é usado um kernel Gaussiano. É feito com a função, cv2.GaussianBlur (). Devemos especificar a largura e altura do kernel, que deve ser positivo e estranho. Também devemos especificar o desvio padrão nas direções X e Y, sigmaX e sigma, respectivamente. Se apenas sigmaX for especificado, sigmaY é tomado como igual a sigmaX. Se ambos forem dados como zeros, eles são calculados a partir do tamanho do kernel. A filtragem gaussiana é altamente eficaz na remoção do ruído gaussiano da imagem. Se você quiser, você pode criar um kernel gaussiano com a função, cv2.getGaussianKernel (). O código acima pode ser modificado para o borrão Gaussiano: 3. Filtragem Mediana Aqui, a função cv2.medianBlur () calcula a mediana de todos os pixels sob a janela do kernel e o pixel central é substituído por esse valor mediano. Isso é altamente eficaz na remoção de barulho de sal e pimenta. Uma coisa interessante a notar é que, nos filtros gaussianos e de caixa, o valor filtrado para o elemento central pode ser um valor que pode não existir na imagem original. No entanto, este não é o caso da filtragem mediana, uma vez que o elemento central é sempre substituído por algum valor de pixel na imagem. Isso reduz o ruído de forma eficaz. O tamanho do kernel deve ser um inteiro ímpar positivo. Nesta demo, adicionamos um ruído 50 à nossa imagem original e usamos um filtro mediano. Verifique o resultado: 4. Filtragem bilateral Como observamos, os filtros que apresentamos anteriormente tendem a desfocar bordas. Este não é o caso do filtro bilateral, cv2.bilateralFilter (). Que foi definido para, e é altamente eficaz na remoção de ruído enquanto preserva as arestas. Mas a operação é mais lenta em comparação com outros filtros. Nós já vimos que um filtro Gaussiano leva o bairro ao redor do pixel e encontra sua média ponderada gaussiana. Este filtro Gaussiano é uma função do espaço sozinho, ou seja, pixels próximos são considerados durante a filtragem. Não considera se os pixels têm quase o mesmo valor de intensidade e não considera se o pixel está em uma borda ou não. O efeito resultante é que os filtros gaussianos tendem a desfocar bordas, o que não é desejável. O filtro bilateral também usa um filtro gaussiano no domínio espacial, mas também usa um componente de filtro gaussiano (multiplicativo) (que é uma função das diferenças de intensidade de pixels). A função gaussiana do espaço garante que apenas os pixels são 8216 vizinhos do espaço 8217 são considerados para filtragem, enquanto o componente gaussiano aplicado no domínio da intensidade (uma função gaussiana das diferenças de intensidade) assegura que apenas aqueles pixels com intensidades semelhantes aos do pixel central ( 8216intensity neighbors8217) estão incluídos para calcular o valor de intensidade desfocada. Como resultado, este método preserva bordas, uma vez que, para os pixels situados perto das bordas, pixels vizinhos colocados no outro lado da borda e, portanto, exibindo variações de grande intensidade quando comparados com o pixel central, não serão incluídos para desfocagem. A amostra abaixo demonstra o uso de filtragem bilateral (Para detalhes sobre argumentos, veja os documentos OpenCV). Observe que a textura na superfície desapareceu, mas as bordas ainda estão preservadas. Ainda estou cortando um script de digitalização de livros, e por enquanto, tudo o que preciso é poder detectar automaticamente uma página. O livro preenche 90 da tela (eu uso uma webcam cruddy para a detecção de movimento), então, quando eu giro uma página, a direção do movimento é basicamente na mesma direção. Eu modifiquei um script de rastreamento de movimento, mas os derivativos estão me levando para lugar nenhum: ele detecta o movimento médio do centro médio de todas as caixas, o que é extremamente ineficiente. Como eu iria sobre a detecção de tais movimentos de forma rápida e precisa (ou seja, dentro de um limiar) Estou usando o Python, e eu pretendo ficar com ele, já que minha estrutura inteira é baseada em Python. E a ajuda é apreciada, então agradeço a todos com antecedência. Felicidades.

No comments:

Post a Comment