Eu tenho essa imagem
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
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:
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)
Não consigo entender o que estou fazendo de errado aqui por favor, ajude?
image-processing
vini
fonte
fonte
Respostas:
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:
Manipulação de brilho no domínio da imagem original.
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.
fonte
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.
fonte
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
é Hue Component,
é um componente de saturação e é um componente de luminosidade.
É sabido que a luminosidade corresponde estreitamente ao equivalente cinza da imagem e também que a sombra é essencialmente
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
Nesta primeira imagem, removemos o componente Luminosidade (substituído por um valor médio fixo)
Na segunda imagem, removemos o componente Saturação da mesma maneira
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.
fonte
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.
fonte