¿Cómo puedo eliminar sombras de una imagen?

17

Tengo esta imagen

ingrese la descripción de la imagen aquí

Me gustaría eliminar la sombra de la imagen. Sé que se han utilizado muchos métodos diferentes, como ciertas operaciones morfológicas, para eliminar sombras:

He creado esta máscara para la misma imagen.

ingrese la descripción de la imagen aquí

¿Hay otros métodos que podría intentar usar esta máscara que he creado?

EDITAR :

imagen de entrada y máscara del mismo tamaño solicitado:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

EDIT 2: he generado una imagen 1D invariante, sin embargo, no es perfecta

  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)

ingrese la descripción de la imagen aquí

No puedo entender lo que estoy haciendo mal aquí por favor ayuda?

vini
fuente
¡Buena pregunta! ¿Has intentado aumentar el brillo en la región enmascarada?
Dima
55
Comprueba mi respuesta aquí: dsp.stackexchange.com/questions/454/…
datageist
En términos simples, la reflectividad de las dos superficies diferentes es diferente, tanto en términos absolutos como en cómo reflejan la luz directa frente a la indirecta. Entonces responden de manera diferente a estar en una sombra y necesitan fórmulas diferentes para cancelar la sombra.
Daniel R Hicks
Existen otros métodos como la detección de bordes utilizando la segunda derivada, el gradiente y el operador laplaciano.
1
Pregunta relacionada: Mathica.stackexchange.com/questions/7414/…
Niki Estner

Respuestas:

11

Hay docenas de publicaciones que tratan sobre la detección de sombras, la generación de máscaras de sombras y, de hecho, algunas que realmente eliminan las sombras, como las mencionadas en las publicaciones anteriores. Podría agregar algunos a la lista, si es necesario. El problema, sin embargo, está en mi humilde opinión lejos de ser resuelto. Para un inicio rápido, dada una máscara de sombra, sugiero (y he intentado en el pasado) los dos enfoques siguientes. Definitivamente reducen las sombras, pero no siempre son perfectas, y estoy seguro de que hay publicaciones (no para mí) que tratan sobre la eliminación de sombras de manera similar.

  • Técnicas de manipulación del dominio de degradado como se describe aquí (se proporcionan códigos C y Matlab): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html El enfoque de integración de degradado se puede utilizar para una serie de procesos de procesamiento de imágenes problemas, vea las diapositivas / presentación para más ejemplos.

    La idea general:

    1. Calcule las derivadas espaciales (imágenes de gradiente) para todos los canales de color.
    2. Utilice los límites de sombra de la máscara de sombra para generar una máscara de peso que esté cerca de cero en los límites de sombra y aumente a uno dentro de un vecindario específico a lo largo del borde de sombra, es decir, ortogonal a un punto de borde dado.
    3. Multiplique la máscara de peso de (2.) con todas las imágenes de degradado para reducir / amortiguar los límites / bordes de las sombras.
    4. Integre las imágenes de gradiente utilizando el código del enlace anterior.
    5. Para las imágenes RGB, desde mi experiencia, calcule el promedio de los canales separados de las imágenes originales y escale las imágenes integradas para que coincidan con estos valores para evitar artefactos de color "divertidos".
  • Manipulación del brillo en el dominio de imagen original.

    1. Use la máscara de sombra para generar una máscara de peso que sea una fuera de las regiones de sombra, tenga una transición suave (hacia arriba) a través del límite de sombra y un factor de escala mayor que un factor dentro de las regiones de sombra. Como se sugirió en una publicación anterior, el factor de escala se puede estimar a partir del área que rodea inmediatamente un área de sombra utilizando el brillo promedio junto con el brillo promedio de la región de sombra.
    2. Multiplique las imágenes originales (por canal) con la máscara de peso, sujeta a recorte.

También he intentado usar diferentes modelos de color, por ejemplo, HSV, que presentan luminancia o brillo directamente, que luego pueden modificarse independientemente del color (tono / saturación). Esto funciona esencialmente como la manipulación del brillo, es decir, generar una máscara de peso suave y multiplicarla con el canal de luminancia. Tal vez los dos enfoques, es decir, la integración de gradiente y la manipulación de brillo, se pueden combinar de una manera inteligente, pero alguien probablemente ya lo haya intentado antes.

Espero que ayude, saludos cordiales, Derik.

Dr.D.
fuente
2
Link parece muerto, aquí hay una versión en caché .
Delgan
9

He visto esta misma imagen antes. De hecho, aquí está en el mismo documento sobre el tema que está buscando resolver. Seguido con otro artículo del mismo grupo de investigación en la Universidad Simon Fraser. Ambos le darán una buena introducción al problema de resolver el color para la iluminación invariante.

tiluki
fuente
sí, lo sé, pero estaba tratando de probar un método diferente para el mismo problema
vini
@vini: Si has leído que debes saber a qué te enfrentas --- las simples operaciones morfológicas no van a cortarlo. ¿Qué más has leído y probado? Puedo sugerir otros documentos si es necesario.
Emre
@Emre, estoy tratando de cambiar el brillo para que el efecto de la sombra se reduzca, sin embargo, no hay mucho éxito. ¿Se puede usar un mapa de bordes para enmascarar esta sombra? Sí, pensé que las operaciones morfológicas no ayudarían, intenté imsubtract (matlab) para eliminar la sombra
vini
55
@vini: Este problema está más allá de las soluciones de una sola línea. Los documentos vinculados (y también hay otros) ya resuelven el problema en la mayoría de los casos, por lo que si desea hacer algo nuevo, tendrá que encontrar sus debilidades, y eso significa comprenderlos bien, por lo que le insto a que los vuelva a leer. cuidadosamente. Usualmente mencionan problemas en las secciones de Discusión y Conclusión. El enfoque de proyección invariante de iluminación de cromaticidad logarítmica me parece más prometedor ...
Emre
4

Existen varios métodos que hablan sobre la detección de sombras que funcionan esencialmente en un contexto conocido. No existe una noción absoluta de lo que es la sombra con solo mirar un color de píxel. Sin embargo, debe identificar la sombra sin referencia.

Si bien este problema es difícil, aquí hay una solución trivial, aunque fácilmente podría no ser la mejor, pero podría ayudarlo a obtener cierta perspectiva.

Examinemos los componentes de la imagen en el dominio HSL

Matizes un componente de tono, un componente de
Saturaciónsaturación y un Ligerezacomponente de luminosidad

Es bien sabido que la claridad corresponde al equivalente gris de la imagen y también que la sombra es esencialmente

Una región semitransparente en la que la reflectancia de la escena experimenta una atenuación local.

A partir de aquí .

Por lo tanto, es una superposición que disminuye la reflectancia de dicha oscuridad, puede identificar lo mismo en la parte gris de la imagen, pero encontrará que su interacción es mucho menor en las partes de color (tono y saturación a algo).

Ahora, aquí, puedo producir dos imágenes, donde

  1. En esta primera imagen hemos eliminado el componente Luminosidad (reemplazado por un valor promedio fijo)
    ingrese la descripción de la imagen aquí

  2. En la segunda imagen hemos eliminado el componente Saturación de la misma manera. Saturación eliminada

Podemos ver que incluso si se preserva la luminosidad pero se elimina la saturación, la información crítica sobre la sombra está intacta, mientras que cuando eliminamos la luminosidad, la información de la sombra se reduce significativamente. Aunque esto no es perfecto, crea una característica clave que le permite distinguir lo que realmente es una sombra del fondo.

En base a esto, puede tratar la imagen "Luminosidad eliminada" como fondo y otra como la imagen incidente y segmentar la imagen en base a estas dos informaciones; Entonces, en las regiones donde la sombra no está jugando un papel importante, la diferencia podría ser mucho menor, donde, como cuando existe la sombra, ese segmento mostrará un alto error.

Alternativamente, puede aplicar una segmentación independiente (como el crecimiento de la región) en ambas imágenes. La imagen eliminada de saturación tendrá un segmento adicional que no existirá en la imagen eliminada de claridad que no es más que un segmento de sombra.

Nota: Puede distinguir la imagen eliminada por la ligereza HSL con el original mismo. Pruebe también cosas similares con el espacio de color HSV, así como con YCbCr.

Dipan Mehta
fuente
2

Puede tomar un histograma del área enmascarada (la sombra) y aplicar una transformación de color lineal para que coincida el histograma del área enmascarada y el resto de la imagen.

Supongo que el factor de escala en la transformación sería insignificante, solo sería necesario cambiar el brillo, por lo que puede tomar el brillo promedio de los dos segmentos (sombra, entorno) y aplicar la diferencia.

Libor
fuente