Friday, 14 December 2018

Cv2 moving average


Eu não tenho certeza sobre o erro, mas confira a documentação para cv. RunningAvg Ele diz que o destino deve ser 32 ou ponto flutuante de 64 bits. Então eu fiz uma pequena correção em seu código e ele funciona. Criei uma imagem de ponto flutuante de 32 bits para armazenar valores médios em execução. Em seguida, outra imagem de 8 bits para que eu possa mostrar a média de execução de imagem: Agora veja o resultado: Em um determinado instante, eu salvei um quadro e sua correspondente médio frame em execução. Você pode ver o obstáculo (minha mão) bloqueia os objetos por trás. Agora executando frame médio: Ele quase removeu a minha mão e mostra objetos em segundo plano. É assim que é uma boa ferramenta para subtração de fundo. Mais um exemplo de um vídeo de tráfego típico: Suavização de imagens Aprenda a: Blur imagess com vários filtros de baixa passagem Aplicar filtros personalizados a imagens (convolução 2D) Convolução 2D (Filtragem de imagem) Como para sinais unidimensionais, as imagens também podem ser filtradas Com vários filtros passa-baixa (LPF), filtros passa-alta (HPF), etc. Um LPF auxilia na remoção de ruído ou embaçamento da imagem. Um filtro HPF ajuda a encontrar bordas em uma imagem. OpenCV fornece uma função, cv2.filter2D (). Para convolver um kernel com uma imagem. Como exemplo, vamos tentar um filtro de média em uma imagem. Um kernel de filtro de média de 5x5 pode ser definido da seguinte maneira: Filtrando com o resultado do kernel acima resulta o seguinte sendo executado: para cada pixel, uma janela 5x5 é centrada neste pixel, todos os pixels que caem dentro desta janela são resumidos eo 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 da imagem para produzir a imagem filtrada de saída. Experimente este código e verifique o resultado: Blurring de imagem (Suavização de imagem) O desfoque de imagem é conseguido convertendo a imagem com um kernel de filtro passa-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 sendo desfocada quando este é filtro é aplicado. (Bem, há técnicas de desfocagem que não desfocam bordas). OpenCV fornece principalmente quatro tipos de técnicas de desfoque. 1. Estabelecimento de média Isso é feito convolvendo a imagem com um filtro de caixa normalizado. Ele simplesmente leva a média de todos os pixels sob a á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 ea altura do kernel. Um filtro caixa 3x3 normalizado seria semelhante a este: Se você don8217t deseja usar um filtro de caixa normalizada, use cv2.boxFilter () e passar o argumento normalizeFalse para a função. Verifique a demo de exemplo abaixo com um kernel de tamanho 5x5: 2. Filtragem Gaussiana Nesta abordagem, em vez de um filtro de caixa consistindo de coeficientes de filtro iguais, um kernel Gaussiano é usado. É feito com a função, cv2.GaussianBlur (). Devemos especificar a largura ea altura do kernel que deve ser positivo e ímpar. Também devemos especificar o desvio padrão nas direções X e Y, sigmaX e sigmaY, respectivamente. Se apenas o sigmaX for especificado, sigmaY é tomado como igual a sigmaX. Se ambos são 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 borrar Gaussian: 3. Median Filtering Aqui, a função cv2.medianBlur () calcula a mediana de todos os pixels sob a janela do kernel eo pixel central é substituído por esse valor mediano. Isso é altamente eficaz na remoção de ruído de sal e pimenta. Uma coisa interessante a notar é que, nos filtros Gaussiano e Box, 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 na mediana de filtragem, 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 demonstração, adicionamos um ruído de 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 para o filtro bilateral, cv2.bilateralFilter (). Que foi definido para, e é altamente eficaz na remoção de ruído enquanto preserva bordas. Mas a operação é mais lenta em comparação com outros filtros. Já vimos que um filtro gaussiano toma a vizinhança ao redor do pixel e encontra sua média ponderada gaussiana. Este filtro gaussiano é uma função do espaço sozinho, isto é, os pixels próximos são considerados durante a filtragem. Ele não considera se 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 é indesejável. O filtro bilateral também usa um filtro gaussiano no domínio espacial, mas também usa mais um componente de filtro (multiplicativo) gaussiano 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 vizinhos 8217spatial8217 são considerados para a filtragem, enquanto que o componente gaussiano aplicado no domínio de intensidade (uma função gaussiana das diferenças de intensidade) garante que apenas aqueles pixels com intensidades semelhantes ao do pixel central 8216, vizinhos8217) para calcular o valor de intensidade desfocada. Como resultado, este método preserva bordas, uma vez que para pixels situados perto de bordas, os pixels vizinhos colocados no outro lado da aresta e, portanto, exibindo grandes variações de intensidade quando comparados com o pixel central, não serão incluídos para desfocagem. O exemplo abaixo demonstra o uso de filtragem bilateral (Para detalhes sobre argumentos, consulte os documentos do OpenCV). Observe que a textura na superfície desapareceu, mas as arestas ainda são preservadas. Imagens suaves A explicação abaixo pertence ao livro Computer Vision: Algorithms and Applications de Richard Szeliski e ao LearningOpenCV Smoothing. Também chamado de borrão. É uma operação de processamento de imagem simples e freqüentemente usada. Existem muitas razões para suavizar. Neste tutorial vamos nos concentrar no alisamento para reduzir o ruído (outros usos serão vistos nos tutoriais a seguir). Para executar uma operação de suavização, aplicaremos um filtro à nossa imagem. O tipo mais comum de filtros são lineares. Em que um valor de pixel de saída 8217s (isto é) é determinado como uma soma ponderada de valores de pixel de entrada (isto é): Ajuda a visualizar um filtro como uma janela de coeficientes deslizando através da imagem. Existem muitos tipos de filtros, aqui vamos mencionar os mais utilizados: Filtro de caixa normalizada Este filtro é o mais simples de todos Cada pixel de saída é a média de seus vizinhos do kernel (todos eles contribuem com pesos iguais) O kernel está abaixo: Gaussian Filtro Provavelmente o filtro mais útil (embora não o mais rápido). A filtragem gaussiana é feita convolvendo cada ponto na matriz de entrada com um kernel gaussiano e, em seguida, somando-os todos para produzir a matriz de saída. Apenas para tornar a imagem mais clara, lembre-se de como um kernel 1D gaussiano parece Assumir que uma imagem é 1D, você pode notar que o pixel localizado no meio teria o maior peso. O peso de seus vizinhos diminui à medida que a distância espacial entre eles eo pixel central aumenta. Lembre-se que um Gaussiano 2D pode ser representado como: Filtro Mediano O filtro mediano percorre cada elemento do sinal (neste caso a imagem) e substitui cada pixel pela mediana de seus pixels vizinhos (localizados em uma vizinhança quadrada ao redor do pixel avaliado ). Filtro Bilateral Até agora, explicamos alguns filtros cujo principal objetivo é suavizar uma imagem de entrada. No entanto, às vezes os filtros não só dissolver o ruído, mas também afastar as bordas. Para evitar isso (pelo menos em certa medida), podemos usar um filtro bilateral. De forma análoga ao filtro gaussiano, o filtro bilateral também considera os pixels vizinhos com pesos atribuídos a cada um deles. Estes pesos têm duas componentes, a primeira das quais é a mesma ponderação utilizada pelo filtro Gaussiano. O segundo componente leva em conta a diferença de intensidade entre os pixels vizinhos e o avaliado. Para uma explicação mais detalhada, você pode verificar este link O que este programa faz Carrega uma imagem Aplica 4 tipos diferentes de filtros (explicados em Teoria) e mostra as imagens filtradas sequencialmente Explicação Let8217s verifica as funções OpenCV que envolvem apenas o procedimento de suavização, Resto já é conhecido por agora. Filtro de Bloqueio Normalizado: O OpenCV oferece a função de desfocagem para realizar a suavização com este filtro. Nós especificamos 4 argumentos (mais detalhes, verifique a Referência): src. Imagem de origem dst. Tamanho da imagem de destino (w, h). Define o tamanho do kernel a ser usado (de largura w pixels e altura h pixels) Ponto (-1, -1). Indica onde o ponto de ancoragem (o pixel avaliado) está localizado em relação à vizinhança. Se houver um valor negativo, então o centro do kernel é considerado o ponto de ancoragem. É executado pela função GaussianBlur: Aqui usamos 4 argumentos (mais detalhes, verifique a referência do OpenCV):

No comments:

Post a comment