Pergunta

há duas imagens

texto alternativo http://bbs.shoucangshidai.com/attachments/month_1001/1001211535bd7a644e95187acd.jpg texto alternativo http://bbs.shoucangshidai.com/attachments/month_1001/10012115357cfe13c148d3d8da.jpguma é a imagem de fundo, a outra é a foto de uma pessoa com o mesmo fundo, mesmo tamanho, o que quero fazer é remover o fundo da segunda imagem e destilar apenas o perfil da pessoa.o método comum é subtrair a primeira imagem da segunda, mas meu problema é se a cor da roupa da pessoa for semelhante ao fundo.o resultado da subtração é horrível.não consigo obter o perfil de pessoas inteiras.quem tiver uma boa ideia para remover o fundo me dê alguns conselhos.Agradeço antecipadamente.

Foi útil?

Solução

Se você tiver uma boa estimativa do fundo da imagem, subtraí -la da imagem com a pessoa é um bom primeiro passo. Mas é apenas o primeiro passo. Depois disso, você precisa segmentar a imagem, ou seja, você precisa particionar a imagem em pixels "fundo" e "em primeiro plano", com restrições como estas:

  1. Nas áreas em primeiro plano, a diferença média da imagem de fundo deve ser alta
  2. Nas áreas de fundo, a diferença média da imagem de fundo deve ser baixa
  3. As áreas devem ser suaves. O comprimento e a curvatura do contorno devem ser mínimos.
  4. As fronteiras das áreas devem ter um alto contraste na imagem de origem

Se você é matematicamente inclinado, essas restrições podem ser modeladas perfeitamente com o funcional de Mumford-Shah. Veja aqui para obter mais informações.

Mas você provavelmente pode adaptar outros algoritmos de segmentação ao problema.

Se você deseja uma versão rápida e simples (mas não perfeita), pode tentar o seguinte:

  • subtrair as duas imagens
  • Encontre o maior "bolhas" consecutivas de pixels com uma diferença de fundo para o fundo para o fundo maior que algum limite. Esta é a primeira estimativa aproximada da "área da pessoa" em primeiro plano, mas a segmentação não atende aos critérios 3 e 4 acima.
  • Encontre o esboço do maior blob (EDITAR: Observe que você não precisa começar no esboço. Você também pode começar com um polígono maior, pois as etapas o reduzirão automaticamente para a posição ideal.)
  • Agora passe por cada ponto do contorno e suavize o contorno. ou seja, para cada ponto, encontre o ponto que minimiza a fórmula: c1*l - c2*g, onde l é o comprimento do polígono de contorno se o ponto fosse movido para cá e g é o gradiente no local para o qual seria movido, para, C1/C2 são constantes para controlar o processo. Mova o ponto para essa posição. Isso tem o efeito de suavizar o polígono do contorno em áreas de baixo gradiente na imagem de origem, mantendo -a amarrada a altos gradientes na imagem de origem (ou seja, as fronteiras visíveis da pessoa). Você pode tentar diferentes expressões para L e G, por exemplo, L poderia levar em consideração o comprimento e a curvatura, e G também pode levar o gradiente em segundo plano e subtrair imagens.
  • Você provavelmente terá que re-normalizar o polígono de contorno, ou seja, certifique-se de que os pontos no contorno sejam espaçados regularmente. Ou isso, ou certifique -se de que as distâncias entre os pontos permaneçam regulares na etapa antes. ("Cobras geodésicas")
  • Repita as duas últimas etapas até a convergência

Agora você tem um polígono de contorno que toca a borda visível para a pessoa e continua suavemente onde a borda não é visível ou tem baixo contraste. Procure "cobras" (por exemplo, aqui) Para maiores informações.

Outras dicas

Filtre passa-baixa (desfoque) as imagens antes de subtraí-las.Em seguida, use esse sinal de diferença como máscara para selecionar os pixels de interesse.Um filtro amplo o suficiente irá ignorar os recursos muito pequenos (alta frequência) que acabam criando regiões "horríveis" dentro do seu objeto de interesse.Também reduzirá o destaque do ruído e do desalinhamento no nível do pixel (as informações de frequência mais alta).

Além disso, se você tiver mais de dois quadros, a introdução de alguma histerese de tempo também permitirá formar regiões de interesse mais estáveis ​​ao longo do tempo.

Uma técnica que eu acho comum é usar um Modelo de mistura. Pegue uma série de quadros de fundo e para cada pixel construir um modelo de mistura para sua cor.

Quando você aplica um quadro com a pessoa, você terá alguma probabilidade de que a cor seja em primeiro plano ou em segundo plano, dadas as densidades de probabilidade no modelo de mistura para cada pixel.

Depois de ter P (pixels é em primeiro plano) e P (pixels é plano de fundo), você pode limitar as imagens de probabilidade.

Outra possibilidade é usar as probabilidades como insumos em algum algoritmo de segmentação mais inteligente. Um exemplo é cortes de gráficos O que notei funciona muito bem.

No entanto, se a pessoa estiver vestindo roupas visualmente indistudíveis do fundo, obviamente, nenhum dos métodos descritos acima funcionaria. Você teria que obter outro sensor (como IR ou UV) ou ter um "modelo de pessoa" bastante elaborado que poderia "adicionar" as pernas na posição correta se encontrar o que pensa ser um tronco e cabeça.

Boa sorte com o projeto!

Antecedentes versus a detecção de primeiro plano é muito subjetiva. O cenário de aplicação define plano de fundo ou primeiro plano. No entanto, no aplicativo que você detalha, acho que você está implicitamente dizendo que a pessoa é o primeiro plano. Usando a suposição acima, o que você procura é um algoritmo de detecção de pessoa. Uma solução possível é:

  1. Execute um detector de recurso Haar+ Cascada aumentada de classificadores fracos (veja o OpenCV Wiki para detalhes)
  2. Calcule o movimento entre quadros (diferenças)
  3. Se houver detecção de face a +ve para um quadro, os pixels de movimento do cluster ao redor da face (Algoritmo KNN)

Voila ... você deve ter um detector de pessoa simples.

Publique a foto no Craigslist e diga a eles que você pagará US $ 5 por alguém para fazê -lo.

Garantido que você receberá hits em minutos.

Em vez de uma subtração direta, você pode passar por ambas as imagens, Pixel by Pixel e apenas "subtrair" os pixels que são exatamente os mesmos. É claro que isso não será responsável por pequenas variações nas cores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top