Como remover sombras de uma imagem?


17

Eu tenho essa imagem

insira a descrição da imagem aqui

Eu gostaria de remover a sombra da imagem. Eu sei que muitos métodos diferentes, como certas operações morfológicas, foram usados ​​para remover sombras:

Eu criei esta máscara para a mesma imagem

insira a descrição da imagem aqui

Existem outros métodos que eu poderia tentar usar essa máscara que eu criei?

EDIT :

imagem de entrada e máscara do mesmo tamanho, conforme solicitado:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

EDIT 2: eu gerei uma imagem invariável 1D, no entanto, não é perfeita

  I = imread('shadow.jpg');
       J = im2double(I);

      R = J(:,:,1);
      G = J(:,:,2);
      B = J(:,:,3);

     [len,wid] = size(R);

     % Generation of 2-D Log Chromaticity Image.
     for i = 1:len
        for j = 1:wid
           if ((R(i,j)*G(i,j)*B(i,j))~= 0)
              c1(i,j) = R(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c2(i,j) = G(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c3(i,j) = B(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
           else
              c1(i,j) = 1;
              c2(i,j) = 1;
              c3(i,j) = 1;
        end
    end
end

rho1 = mat2gray(log(c1));
rho2 = mat2gray(log(c2));
rho3 = mat2gray(log(c3));

X1 = mat2gray(rho1*1/(sqrt(2)) - rho2*1/(sqrt(2)));                                         %(1/sqrt(2); -1/sqrt(2); 0)
X2 = mat2gray(rho1*1/(sqrt(6)) + rho2*1/(sqrt(6)) - rho3*2/(sqrt(6)));   %(1/sqrt(6); 1/sqrt(6); -2/sqrt(6))

theta = 120;

InvariantImage = cos(theta*pi/180)*X1 + sin(theta*pi/180)*X2;
imagesc(InvariantImage); colormap(gray)

insira a descrição da imagem aqui

Não consigo entender o que estou fazendo de errado aqui por favor, ajude?


Boa pergunta! Você já tentou aumentar o brilho na região mascarada?
Dima

5
Verifique minha resposta aqui: dsp.stackexchange.com/questions/454/…
datageist

Em termos simples, a refletividade das duas superfícies diferentes é diferente, tanto em termos absolutos quanto em como refletem a luz direta versus a indireta. Portanto, eles respondem de maneira diferente a estar na sombra e precisam de fórmulas diferentes para cancelar a sombra.
Daniel R Hicks

Existem outros métodos, como a detecção de arestas usando a segunda derivada, usando o gradiente e o operador Laplaciano.

Respostas:


11

Existem dezenas de publicações que tratam da detecção de sombras, gerando máscaras de sombras e, de fato, algumas que realmente removem sombras - como as mencionadas nas postagens anteriores. Eu poderia adicionar alguns à lista, se necessário. O problema, no entanto, está IMHO longe de ser resolvido. Para um início rápido, com uma máscara de sombra, sugiro (e tentei no passado) as duas abordagens a seguir. Definitivamente, reduzem as sombras - nem sempre são perfeitas, e tenho certeza de que existem publicações (não por mim) que lidam com a remoção de sombras de maneiras semelhantes.

  • Técnicas de manipulação de domínio de gradiente, conforme descrito aqui (códigos C e Matlab fornecidos): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html A abordagem de integração de gradiente pode ser usada para vários processos de imagem problemas, consulte os slides / apresentação para obter mais exemplos.

    A ideia geral:

    1. Calcule as derivadas espaciais (imagens de gradiente) para todos os canais de cores.
    2. Use os limites da sombra da máscara para gerar uma máscara de peso que seja próxima de zero nos limites da sombra e aumente para uma dentro de uma vizinhança especificada ao longo da borda da sombra, ou seja, ortogonal a um determinado ponto da borda.
    3. Multiplique a máscara de peso de (2.) com todas as imagens de gradiente para reduzir / amortecer os limites / bordas da sombra.
    4. Integre as imagens de gradiente usando o código do link acima.
    5. Para imagens RGB, pela minha experiência, calcule a média dos canais separados das imagens originais e dimensione as imagens integradas para corresponder a esses valores e evitar artefatos de cores "engraçados".
  • Manipulação de brilho no domínio da imagem original.

    1. Use a máscara de sombra para gerar uma máscara de peso que seja uma região de sombra externa, que tenha uma transição suave (para cima) através do limite da sombra e um fator de escala maior que um dentro das regiões de sombra. Conforme sugerido em um post anterior, o fator de escala pode ser estimado a partir da área imediatamente ao redor de uma área de sombra usando o brilho médio juntamente com o brilho médio da região de sombra.
    2. Multiplique as imagens originais (por canal) com a máscara de peso, sujeita a cortes.

Também tentei usar diferentes modelos de cores, por exemplo, HSV, que apresentam luminância ou brilho diretamente, que podem ser modificados independentemente da cor (matiz / saturação). Isso funciona essencialmente como a manipulação de brilho, ou seja, gera uma máscara de peso suave e multiplica-a pelo canal de luminância. Talvez as duas abordagens, isto é, integração de gradiente e manipulação de brilho, possam ser combinadas de maneira inteligente, mas alguém provavelmente já tentou isso antes.

Espero que ajude, Atenciosamente, Derik.


2
Link parece morto, aqui está uma versão em cache .
Delgan

9

Eu já vi essa mesma imagem antes. De fato, aqui está o próprio artigo sobre o assunto que você deseja resolver. Seguiu-se outro artigo do mesmo grupo de pesquisa da Universidade Simon Fraser. Ambos oferecem uma boa introdução ao problema de resolver cores para invariância à iluminação.


sim eu sei disso, mas estava tentando testar um método diferente para o mesmo problema
vini

@ vini: Se você leu que deveria saber o que está enfrentando --- operações morfológicas simples não serão suficientes. O que mais você leu e tentou? Posso sugerir outros trabalhos, se necessário.
Emre

@ Emre Estou tentando alterar o brilho para que o efeito da sombra reduz, porém, não muito sucesso. Pode um mapa de arestas ser usado para, de alguma forma, mascarar essa sombra? (matlab) para remover a sombra
vini 5/05

5
@ vini: Esse problema está além das soluções de uma linha. Os documentos vinculados (e também existem outros) já resolvem o problema na maioria dos casos; portanto, se você quiser fazer algo novo, terá que encontrar as fraquezas deles, e isso significa entendê-las bem, então peço que as releia. cuidadosamente. Eles geralmente mencionam problemas nas seções Discussão e Conclusão. A abordagem projeção iluminação invariante log-chromaticity parece mais promissor para mim ...
Emre

4

Existem vários métodos que falam sobre a detecção de sombra funcionam essencialmente em segundo plano conhecido. Não há noção absoluta do que é sombra apenas olhando para uma cor de pixel. No entanto, você precisa identificar a sombra sem referência.

Embora esse problema seja difícil, aqui está uma solução trivial - embora prontamente essa possa não ser a melhor, mas, no entanto, pode ajudá-lo a obter alguma perspectiva.

Vamos examinar os componentes da imagem no domínio HSL

Matizé Hue Component,
Saturaçãoé um componente de saturação e Levezaé um componente de luminosidade.

É sabido que a luminosidade corresponde estreitamente ao equivalente cinza da imagem e também que a sombra é essencialmente

uma região semitransparente na qual a reflexão da cena sofre uma atenuação local.

A partir daqui .

Portanto, é uma sobreposição que diminui a refletância, dizendo que a escuridão pode ser identificada na parte cinza da imagem - mas você descobrirá que ela interage muito menos nas partes coloridas (matiz e saturação, em certa medida).

Agora, aqui, eu sou capaz de produzir duas imagens - onde

  1. Nesta primeira imagem, removemos o componente Luminosidade (substituído por um valor médio fixo)
    insira a descrição da imagem aqui

  2. Na segunda imagem, removemos o componente Saturação da mesma maneira Saturação removida

Podemos ver que, mesmo que a luminosidade seja preservada, mas a saturação seja removida, as informações críticas sobre a sombra permanecem intactas - onde, quando removemos a luminosidade, as informações da sombra diminuem significativamente. Embora isso não seja perfeito, ele cria um recurso importante que permite distinguir o que realmente é uma sombra do plano de fundo.

Com base nisso, você pode tratar a imagem "Luminosidade removida" como plano de fundo e outra como imagem incidente e segmentar a imagem com base nessas duas informações; Portanto, nas regiões onde a sombra não está desempenhando um papel importante, a diferença pode ser muito menor, onde, quando existe sombra, esse segmento mostra um erro alto.

Como alternativa, você pode simplesmente aplicar segmentação independente (como região em crescimento) em ambas as imagens. A imagem removida por saturação terá um segmento adicional que não existirá na imagem removida pela luminosidade, que nada mais é do que um segmento de sombra.

Nota: Você pode distinguir a imagem removida com leveza do HSL com o próprio original. Tente também coisas semelhantes com o espaço de cores HSV e YCbCr.


2

Você pode pegar um histograma da área mascarada (a sombra) e aplicar a transformação linear de cores para que o histograma da área mascarada e do restante da imagem sejam correspondidos.

Suponho que o fator de escala na transformação seria insignificante, apenas a mudança do brilho seria necessária, portanto, você pode apenas pegar o brilho médio dos dois segmentos (sombra, sombreamento) e aplicar a diferença.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.