Tengo esta imagen
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.
¿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:
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)
No puedo entender lo que estoy haciendo mal aquí por favor ayuda?
image-processing
vini
fuente
fuente
Respuestas:
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:
Manipulación del brillo en el dominio de imagen original.
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.
fuente
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.
fuente
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
es un componente de tono, un componente de
saturación y un componente de luminosidad
Es bien sabido que la claridad corresponde al equivalente gris de la imagen y también que la sombra es esencialmente
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
En esta primera imagen hemos eliminado el componente Luminosidad (reemplazado por un valor promedio fijo)
En la segunda imagen hemos eliminado el componente Saturación de la misma manera.
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.
fuente
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.
fuente