Pergunta

Usando imagens de artigos de vestuário tomada contra um fundo consistente, eu gostaria de fazer todos os pixels na imagem transparente, exceto para a roupa. Qual é a melhor maneira de ir sobre isso? Eu pesquisei os algoritmos que são comuns para esta ea biblioteca de código aberto opencv . Além de rolar minha própria ou usando opencv há uma maneira fácil de fazer isso? Estou aberto a qualquer linguagem ou plataforma.

Graças

Foi útil?

Solução

Se o seu fundo é consistend em uma imagem, mas inconsistente em imagens pode ficar complicado, mas aqui é o que eu faria:

  1. Separa-se a imagem em alguma forma de intensidade / cor, tais como YUV ou Lab.
  2. Faça um histograma sobre a parte da cor. Encontrar a cor mais ocorrendo, este é (mais provável) seu fundo (atualização) talvez um truque melhor aqui seria encontrar a cor mais ocorrendo de todos os pixels dentro de um ou dois pixels a partir da borda da imagem.
  3. A partir dos eddges da imagem, definir todos os pixels que têm essa cor e estão ligados à borda através de pixels da mesma cor para transparente.
  4. A borda da peça de roupa agora está indo olhar um pouco feio, porque consistem em pixels que ganham sua cor de tanto o fundo e a peça de roupa. Para combater isso, você precisa fazer um pouco mais de trabalho:

    1. Encontre a borda da peça de roupa por alguns mecanismo borda detecção .
    2. Substitua a cor dos pixels da borda com uma mistura da cor apenas "dentro" do pixel da borda (ou seja, a cor das roupas naquela região) e transparente (se o seu formato de imagem de saída suporta isso).
    3. Se você quiser ficar realmente gosta, você aumentar a transparência, dependendo de quanto "como" a cor de fundo a cor desse pixel é.

Outras dicas

Basicamente, encontrar a cor do fundo e subtrai-lo, mas eu acho que você sabia disso. É um pouco complicado para fazer tudo isso automaticamente, mas parece possível.

Primeiro, dê uma olhada em blob detecção com OpenCV e ver se isso é basicamente feito para você.

Para fazê-lo sozinho:

encontrar o fundo : Existem várias opções. Provavelmente mais fácil é histograma da imagem e do grande número de pixels com valores semelhantes são o fundo, e se há duas grandes coleções, o fundo vai ser o único com um grande buraco no meio. Outra abordagem é tomar uma banda em torno do perímetro como a cor de fundo, mas isso parece inferior como, por exemplo, a reflexão de um flash poderia dramaticamente iluminar localizados mais centralmente pixels de fundo.

remover o fundo : a primeira tomada neste seria limiar da imagem com base na cor de fundo, e depois executar as "abertas" ou algoritmos "fechar" sobre isso, e então usar este como uma máscara para selecionar o seu artigo de vestuário. (O ponto de abertura / fecho é não remover pequenos itens fundo colorido nas roupas, como botões pretos em uma blusa branca, ou, digamos, reflexões brilhantes em roupas pretas.)

OpenCV é uma boa ferramenta para isso.

A parte mais complicada desta provavelmente será na sombra ao redor do objeto (por exemplo, uma jaqueta preta sobre um fundo branco terá uma sombra cinzenta contínua em algumas das arestas e onde fazer este corte?), Mas se você ficar até aqui, colocar uma outra questão.

Se você sabe a intensidade da cor exata do fundo e isso nunca vai mudar e os artigos de vestuário nunca coincidem com esta cor, então esta é uma aplicação simples de subtração de fundo, que é tudo o que não é uma intensidade de cor especial é considerado um "on" pixel, um dos juros. Você pode então usar rotulagem componente conectado ( http://en.wikipedia.org/wiki/Connected_Component_Labeling) para descobrir agrupamentos separados de objetos.

para uma imagem colorida, com o mesmo fundo em cada imagens:

  • converter sua imagem para HSV ou HSL
  • determinar o valor Hue do fundo (+/- 10):. Executar este passo uma vez, usando o photoshop por exemplo, em seguida, usar o mesmo valor em todas as suas fotos
  • executar um limiar cor: no canal de tonalidade excluir a tonalidade do fundo ([0, tonalidade [+] matiz, 255] tipicamente), para todos os outros canais incluem toda a gama de valores (0 a 255, tipicamente). isto irá selecionar pixels que não estão ao fundo.
  • executar uma operação de "preenchimento furos" (normalmente encontrados ao longo funções de análise blob ou rotulagem) para completar a parte da roupa que podem ter sido da mesma cor do que o fundo.
  • Agora você tem uma imagem que é uma "máscara" das roupas:. Diferentes de zero pixels representa as roupas, 0 pixels representa o fundo
  • esta etapa do processamento depende de como você quer fazer pixels transparente: normalmente, se você salvar sua imagem como PNG com um canal alfa (transparência), use uma operação lógica E (também chamado de "mascarar") entre o alfa canal da imagem original ea construção máscara na etapa anterior.
  • voilà, o fundo desapareceu, salve a imagem resultante.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top