Pergunta

Eu estou fazendo algum processamento de imagem e eu preciso de um algoritmo de balanceamento de branco automático que não é muito intensivo em termos de tempo de computação CPU. Quaisquer recomendações?

EDIT:. E se é relevante para a eficiência, eu vou ser a sua aplicação em Java com imagens coloridas como um array de inteiros

Foi útil?

Solução

Um algoritmo relativamente simples é calcular a média dos tons (em HSV ou HSL) dos pixels claros e mais escuros na tela. Em uma pitada, ir apenas com o pixel mais brilhante. Se os tons entre claras e mais escuras são muito diferentes, ir com o pixel luminoso. Se o escuro está perto de ir preto com o pixel brilhante.

Por que sequer olhar para o pixel escuro? Às vezes, o escuro não é quase preto, e dicas para a luz ambiente ou nevoeiro ou neblina.

Isso vai fazer sentido para você se você é um usuário de Photoshop pesado. Destaques em uma foto são independentes (ou fracamente relacionada) com a cor subjacente do objeto. Eles são a sua melhor representação do elenco cor da luz, a menos que a imagem é tão superexpostas que tudo tem sobrecarregado os CCDs.

Em seguida, ajustar os tons de todos os pixels.

Você vai precisar RGB rápido para HSV e HSV às funções RGB. (Mas talvez você pode trabalhar em RGB para as correções de pixels com uma LUT ou interpolação linear.)

Você não quer ir por cor média dos pixels ou cor mais popular. Dessa forma, mentiras loucura.

Para encontrar rapidamente a cor mais brilhante (e o mais escuro), você pode trabalhar em RGB, mas você deve ter multiplicadores de verde, vermelho e azul. Em um monitor RGB, 255 verde é mais brilhante do que 255 vermelho, que é mais brilhante do que 255 azul. Eu costumava ter bons multiplicadores na minha cabeça, mas, infelizmente, eles fugiram minha memória. Você provavelmente pode google para eles.

Isto irá falhar em uma imagem que não tem destaques. Um mate parede pintada, por exemplo. Mas eu não sei o que você pode fazer sobre isso.


Existem muitas melhorias a fazer a este algoritmo simples. Você pode calcular a média vários pixels brilhantes, grade à imagem e agarrar claras e escuras pixels de cada célula, etc. Você vai encontrar alguns ajustes óbvias depois da implementação do algoritmo.

Outras dicas

GIMP, aparentemente, usa um algoritmo muito simples para balanceamento de branco automático. http://docs.gimp.org/en/gimp-layer-white -balance.html

O comando Equilíbrio de Branco ajusta automaticamente as cores da camada ativa esticando os canais vermelho, verde e azul separadamente. Para fazer isso, ele descarta as cores de pixels em cada extremidade dos histogramas vermelho, verde e azul, que são utilizados por apenas 0,05% dos pixels na imagem e se estende a faixa restante, tanto quanto possível. O resultado é que as cores de pixel, que ocorrem muito raramente nas bordas exteriores dos histogramas (talvez bits de poeiras, etc) não influenciam negativamente os valores mínimo e máximo, utilizados para estirar os histogramas, em comparação com a ampliação de contraste. Como “Stretch Contraste”, no entanto, pode haver mudanças de matiz na imagem resultante.

Há um pouco mais ajustes do que é descrito aqui desde a minha primeira tentativa de implementação funciona este parece funcionar para a maioria das fotos, mas outras fotos parecem ter artefatos ou conter muito de tanto verde vermelho ou azul: /

@Charles Ma sugeriu usar o algoritmo de equilíbrio de branco Gimp. Em python e numpy isso poderia ficar assim:

# white balance for every channel independently
def wb(channel, perc = 0.05):
    mi, ma = (np.percentile(channel, perc), np.percentile(channel,100.0-perc))
    channel = np.uint8(np.clip((channel-mi)*255.0/(ma-mi), 0, 255))
    return channel

image = cv2.imread("foo.jpg", 1) # load color
imWB  = np.dstack([wb(channel, 0.05) for channel in cv2.split(img)] )

É rápido, simples e fornece resultados bastante decente

Branco algoritmos de balanceamento são difíceis. Mesmo câmeras digitais obter o errado de vez em quando, mesmo sabendo que um monte de informações adicionais sobre a imagem -. Tais como se foi utilizado o flash, e o nível de luz

Para começar, eu faria vermelho apenas média, verde e azul, e usar isso como o ponto de equilíbrio de branco. Estabeleça limites para ele - estadia dentro dos intervalos de tungstênio, fluorescente e luz do dia. Não será perfeito, mas quando é errado, será relativamente fácil de explicar porquê.

Um algoritmo recentemente publicado é o algoritmo de distribuição de cores e pode ser encontrada aqui: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf no papel, há também a referência ao código fonte Matlab ( http://www.comp.nus.edu.sg/~whitebal/illuminant/files/ illuminantEstimator.m ). É um algoritmo simples que pode ser facilmente programado e os resultados mostram que ele seja muito rápido.

Se você precisa rapidamente adicional e ao mesmo tempo exato equilíbrio branco (constância de cor) algoritmos, você deve verificar no site: http://www.fer.unizg.hr/ipg/resources/color_constancy/

Existem vários algoritmos com sua respectiva fonte codificado que poderia ser apenas os que você procurar.

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