Um problema que discuti originalmente aqui evoluiu e pode ter se tornado um pouco mais simples ao estudá-lo um pouco mais e obter novas informações.
Resumindo, eu gostaria de poder detectar esse padrão mostrado aqui, usando técnicas de visão por computador / processamento de imagem. Como você pode ver, o padrão ideal é composto de quatro 'pings'. O reconhecimento de objeto deve ser:
- Invariante de Mudança
- Horizontalmente, a imagem será cíclica. (ou seja, pressione para a direita, saia à esquerda e vice-versa).
- (Felizmente) Verticalmente, não é cíclico. (ou seja, pressione para cima ou para baixo e ele irá parar).
- Escala invariável (os pings podem variar em 'espessura' como você pode ver.)
Eu poderia continuar, mas anexei imagens que cobrem o que quero dizer, veja abaixo:
Obviamente, eles também podem estar em uma 'escala' diferente, como pode ser visto nesta família:
E, finalmente, aqui estão alguns cenários 'realistas' do que eu realmente poderia receber, onde haveria barulho, as linhas poderiam 'desaparecer' conforme você avançasse para o fundo e, é claro, a imagem terá muitas linhas falsas, artefatos etc.
E, é claro, como uma grande final, existe a possibilidade distinta desse cenário "extremo":
Então, mais uma vez, eu gostaria de pedir algumas orientações sobre quais técnicas de visão computador-máquina devo usar aqui para detectar melhor a ocorrência do meu padrão, onde eu preciso ser invariável para mudar e escalar, como você pode ver, e também será capaz de obter resultados decentes para os cenários realistas. (A boa notícia é que eu NÃO preciso que ele seja rotacionalmente invariável). A única idéia que consegui sugerir até agora é uma correlação bidimensional.
Devo acrescentar que, na realidade, NÃO tenho imagens coloridas - receberei apenas uma mistura de números, então suponho que estamos falando de 'escala de cinza'.
Desde já, obrigado!
PS Pelo que vale a pena, provavelmente usarei C V. aberto
EDIT # 1:
Com base nos comentários, adicionei os detalhes solicitados aqui:
Para características que definem os dados, podemos assumir o seguinte:
O comprimento horizontal de cada ping pode variar, mas eu sei os limites superior e inferior dele. SIM para qualquer coisa dentro deste limite, NÃO para qualquer coisa fora. (Por exemplo, eu sei que a duração dos pings pode estar entre 1 e 3 segundos, por exemplo).
Todos os pings precisam estar 'visíveis' para YES; no entanto, a última linha pode estar ausente e ainda assim quer dizer 'YES'. Caso contrário, NÃO.
O comprimento vertical (a 'espessura') de cada ping pode variar, mas, novamente, também sabemos os limites superior e inferior. (Semelhante ao que você vê nessas imagens). SIM para qualquer coisa dentro desse limite. NÃO para qualquer coisa lá fora.
A altura entre cada ping deve sempre ser a mesma para YES. Se não estiverem, NÃO. (Exemplo, você pode ver como todos os pings têm a mesma altura em relação um ao outro, ~ 110 no eixo vertical). Portanto, 110 +/- 5 pode ser SIM, qualquer outra coisa deve ser NÃO.
Eu acho que é sobre isso - mas deixe-me saber o que mais posso adicionar ... (Além disso, tudo o que é mostrado aqui deve ser registrado como SIM, aliás).
detect this pattern shown here
? Você está interessado apenas em isolar a linha vermelha / amarela ou deseja uma expressão que calcule o relacionamento entre essas linhas. Somente a localização de linhas poderia exigir apenas um limiar ou segmentação. O que você realmente quer?Respostas:
De um modo geral, existem duas abordagens principais para resolver esse problema:
uma. correspondência de modelo ou
b. combinando com um modelo parametrizado.
Pessoalmente, dada a simplicidade do modelo, eu preferiria a segunda abordagem para esse problema.
Etapa 1: identificar os blobs de ping
Como primeiro passo, extraia as "Caixas" - essencialmente os quadrados amarelo / azul. Um método mais simples aqui pode ser apenas limitar a imagem. Não parece haver muitas variações no fundo, exceto que, à medida que o ruído aumenta, ele tende a ser bastante semelhante aos pings. Portanto, o limite pode ser global em toda a imagem - e eu acho que você será capaz de obter um limite decente que funcione em todas as imagens. O limite, no entanto, deve ser inteligente para que você possa usar algo como o método de Otsu. Veja isto e isto para mais referência.
Melhoria dos blocos
Uma das coisas boas que você pode fazer para remover pontos espúrios, que se assemelham ao primeiro plano de ping, onde alguns pixels dentro dos pings também são azuis. Você precisa aqui de uma operação morfológica chamada "Abertura". Aqui está uma das referências do HIPR . Esse tipo de operação requer uma forma inteligente que ajuda a preservar formas semelhantes e remover outras. No seu caso, você pode escolher linhas horizontais. No final, você tem pixels de plano de fundo e primeiro plano que separam os pings sem tocar um no outro.
Etapa 2: marcar / registrar blocos
Agora que você obteve os blobs mais limpos possíveis, é hora de marcá-los como 1,2,3,4 ou A, B, C, D etc. Isso geralmente é realizado pelo que é chamado de algoritmo simples. Percorra cada pixel e, se ele estiver tocando com qualquer região marcada, e também estiver em primeiro plano, atribua-o a esse segmento e crie um novo. Se você encontrar mais de 4 segmentos importantes, precisará escolher os mais relevantes. Aplique aqui alguma heurística, em vez de qualquer algoritmo teórico.
Etapa 3: Modelagem de parâmetros
Agora, depois de obtermos os quatro candidatos mais prováveis dos quatro pings correspondentes, é possível identificar as caixas delimitadoras - essencialmente os cantos superior esquerdo e inferior direito (ou mais pixels esquerdo e direito, bem como as linhas superior e inferior do blob) . Encontre a caixa delimitadora, você pode multar o centróide de cada caixa de ping.
portanto, distâncias entre centróides agora podem ser calculadas:
Essencialmente, você tem 8 parâmetros vecoter:
Etapa 4: Classificação
Na última etapa, agora precisamos ter classificação se existe um padrão de ping sim ou não.
Para algo assim, você pode ter uma boa estrutura classificadora bayesiana.
Existem duas hipóteses que você tem
Primeiro, você estuda muitas imagens onde sabe que elas pertencem à imagem. Agora, você pode plotar vários histogramas ou aplicar algum método de estimativa de densidade. Leia Classificação de Padrão por Duda Hart.
Agora, a partir dos dados de teste
Portanto, você pode calcular
Você precisa combinar essa expressão para a expressão vetorial e precisa fazer muito esforço para colocar exatamente a estimativa do parâmetro a ser feita. Mas estou deixando você com uma abordagem básica aqui.
Faça suas próprias contas, isso será demorado, mas ainda deve ser bastante intuitivo.
EDITAR
Como você já está definindo os critérios específicos de 110 +/- 5 pixels, a última etapa pode ser mais simples. Você provavelmente não precisará calcular todas essas probabilidades se seus critérios de classificação forem fixos.
fonte
Esse problema me parece o problema da detecção do intervalo de repetição de pulso + estimativa. Precisarei desenvolver essa resposta ao longo do tempo, mas o tipo de algoritmo que funciona bem nesse problema é de máxima probabilidade em uma rede .
fonte