Wednesday 6 December 2017

Weighted moving average opencv


A maneira estranha de uma média móvel furões a tendência de uma massa de medições confusas pode ser visto por traçar a média móvel de 10 dias, juntamente com os pesos diários originais, mostrados como pequenos diamantes. As médias móveis utilizadas até agora dão significado igual a todos os dias na média. Este neednt seja assim. Se você pensar nisso, não faz muito sentido, especialmente se você está interessado em usar uma média móvel de longo prazo para suavizar os choques aleatórios na tendência. Suponha que você está usando uma média móvel de 20 dias. Por que deve seu peso quase três semanas atrás ser considerado igualmente relevante para a tendência atual como o seu peso esta manhã Várias formas de médias ponderadas móveis foram desenvolvidos para resolver esta objeção. Em vez de apenas somar as medidas para uma seqüência de dias e dividir pelo número de dias, em uma média móvel ponderada cada medida é primeiro multiplicado por um fator de peso que difere de dia para dia. A soma final é dividida, não pelo número de dias, mas pela soma de todos os fatores de peso. Se fatores de peso maiores forem usados ​​para dias mais recentes e fatores menores para medidas mais adiantadas no tempo, a tendência será mais responsiva a mudanças recentes sem sacrificar a suavização proporcionada por uma média móvel. Uma média móvel não ponderada é simplesmente uma média móvel ponderada com todos os fatores de peso iguais a 1. Você pode usar todos os fatores de peso que você gosta, mas um determinado conjunto com o monicker jawbreaking Exponentially Smoothed Moving Average provou ser útil em aplicações que vão desde radar de defesa aérea Para a negociação do mercado de barriga de porco de Chicago. Vamos colocá-lo para o trabalho em nossa barriga também. Este gráfico compara os fatores de peso para uma média movimentada de 20 dias exponencialmente suavizada com uma média móvel simples que pesa todos os dias igualmente. A suavização exponencial dá à medição de hoje duas vezes o significado que a média simples atribuiria, a medida de ontem um pouco menos do que isso e cada dia sucessivo menos do que seu antecessor com o dia 20 contribuindo apenas 20 tanto para o resultado como com uma média móvel simples. Os fatores de peso em uma média móvel exponencialmente suavizada são poderes sucessivos de um número chamado constante de suavização. Uma média móvel exponencialmente suavizada com uma constante de suavização de 1 é idêntica a uma média móvel simples, uma vez que 1 para qualquer potência é 1. As constantes de suavização inferiores a 1 pesam os dados recentes mais fortemente, com a tendência para as medições mais recentes a aumentar à medida que a suavização Constante diminui em direção a zero. Se a constante de suavização for superior a 1, os dados mais antigos são mais ponderados do que as medidas recentes. Este gráfico mostra os factores de peso resultantes de valores diferentes da constante de suavização. Observe como os fatores de peso são todos 1 quando a constante de suavização é 1. Quando a constante de suavização está entre 0,5 e 0,9, o peso dado a dados antigos cai tão rapidamente em comparação com medidas mais recentes que não há necessidade de restringir a média móvel para Um número específico de dias podemos fazer a média de todos os dados que temos, logo de volta ao início, e deixar os fatores de peso calculados a partir da constante de suavização automaticamente descartar os dados antigos como se torna irrelevante para a tendência atual. Eu encontrei um mais elegante Solução para esta questão. A função que você precisa já é fornecida pelo OpenCV. Isso funciona em imagens em tons de cinza ou em cores de 3 canais: Método convertScaleAbs dimensiona elementos de matriz, calcula valores absolutos e converte os resultados em inteiros não assinados de 8 bits: dst (i) saturatecastabs (src (i) alphabeta) convertScaleAbs (InputArray src , OutputArray dst, double alpha1, double beta0) Exemplo de código respondido Feb 8 15 at 23:46 Sua resposta 2017 Stack Exchange, IncHi, este vai ser um artigo muito simples, mas você vai encontrá-lo muito útil. Trata-se de extração de fundo de um vídeo. Suponha que você é dado vídeo de filmagens de tráfego, pode ser alguma coisa como esta. Tráfego na Índia. E você é solicitado a encontrar um plano de fundo aproximado. Ou qualquer coisa assim. A extração de backgrounds é importante no rastreamento de objetos. Se você já tem uma imagem do fundo nua, então é simples. Mas em muitos casos, você não vai ter uma imagem e assim, você terá que criar um. Isso é onde Running Average vem a calhar. (Eu pensei sobre isso quando um cara fez uma pergunta no SOF. Link) A função que usamos aqui para encontrar Running Average é cv2.accumulateWeighted (). Por exemplo, se estamos assistindo a um vídeo, continuamos alimentando cada quadro para esta função ea função continua encontrando as médias de todos os quadros alimentados conforme a relação abaixo: src não é nada além de nossa imagem de origem. Pode ser em escala de cinza ou imagem colorida e ponto flutuante de 8 ou 32 bits. Dst é a imagem de saída ou acumulador com os mesmos canais que a da imagem de origem, e é de 32 bits ou de 64 bits ponto flutuante. Além disso, devemos declará-lo primeiro a um valor que será tomado como valor inicial. Alpha é o peso da imagem de entrada. De acordo com o Docs, alpha regula a velocidade de atualização (o quão rápido o acumulador 8220forgets8221 sobre imagens anteriores). Em palavras simples, se o alfa é um valor mais alto, a imagem média tenta pegar mesmo mudanças muito rápidas e curtas nos dados. Se for valor mais baixo, a média torna-se lenta e não considerará mudanças rápidas nas imagens de entrada. Vou explicar um pouco com a ajuda de imagens no final do artigo. No código acima, eu estabeleci duas médias, uma com maior valor alfa e outra com menor valor alfa para que você possa entender o efeito de alfa. No início, ambos são definidos para o quadro inicial da captura. E no laço eles são atualizados. Você pode ver alguns resultados no link SOF que já forneci. (Eu forneço os resultados aqui, você pode verificar o código e valor alfa lá): Eu usei minha webcam e salva frame original e média em execução em um determinado instante. Este é um quadro de um vídeo de tráfego típico tomado por uma câmera estacionária. Como você pode ver, um carro está indo na estrada, ea pessoa está tentando atravessar a estrada em um determinado instante de tempo. Mas veja a média corrente naquele tempo. Não há nenhuma pessoa e carro nessa imagem (Na verdade ele está lá, tem um olhar mais atento, então você vai vê-lo, ea pessoa é mais clara do que carro, já que o carro está se movendo muito rápido e através da imagem, não tem muito Efeito, em média, mas a pessoa está lá por um longo tempo, já que ele é lento e se movendo em toda a estrada.) Agora precisamos ver o efeito de alfa nessas imagens. Imagens suaves A explicação abaixo pertence ao livro Computer Vision: Algorithms E Aplicações por Richard Szeliski e para 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. Há 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 nítida, 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 objetivo principal é suavizar uma imagem de entrada. No entanto, às vezes os filtros não só dissolver o ruído, mas também suavizar 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 consideração 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 somente o procedimento de suavização, Resto já é conhecido por agora. Filtro de Bloqueio Normalizado: 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