Comment supprimer les ombres d'une image?

17

J'ai cette image

entrez la description de l'image ici

Je voudrais supprimer l'ombre de l'image. Je sais que beaucoup de méthodes différentes comme certaines opérations morphologiques ont été utilisées pour supprimer les ombres:

J'ai créé ce masque pour la même image

entrez la description de l'image ici

Y a-t-il d'autres méthodes que je pourrais essayer d'utiliser ce masque que j'ai créé?

MODIFIER :

image d'entrée et masque de même taille que demandé:

entrez la description de l'image ici

entrez la description de l'image ici

EDIT 2: j'ai généré une image invariante 1D mais ce n'est pas parfait

  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)

entrez la description de l'image ici

Je ne comprends pas ce que je fais de mal ici, aidez-moi?

vini
la source
Bonne question! Avez-vous essayé d'augmenter la luminosité dans la zone masquée?
Dima
5
Vérifiez ma réponse ici: dsp.stackexchange.com/questions/454/…
datageist
En termes simples, la réflectivité des deux surfaces différentes est différente, à la fois en termes absolus et comment ils reflètent la lumière directe vs indirecte. Ils réagissent donc différemment à l'ombre et ont besoin de formules différentes pour annuler l'ombre.
Daniel R Hicks
Il existe d'autres méthodes comme la détection des contours en utilisant la dérivée seconde, en utilisant le gradient et l'opérateur laplacien.
1
Question connexe: mathematica.stackexchange.com/questions/7414/…
Niki Estner

Réponses:

11

Il existe des dizaines de publications traitant de la détection des ombres, générant des masques d'ombre, et en fait certaines qui suppriment les ombres - telles que celles mentionnées dans les articles précédents. Je pourrais en ajouter à la liste, si nécessaire. Le problème, cependant, est à mon humble avis loin d'être résolu. Pour un démarrage rapide, étant donné un masque d'ombre, je suggère (et j'ai essayé dans le passé) les deux approches suivantes. Ils réduisent définitivement les ombres - mais pas toujours sans couture, et je suis sûr qu'il existe des publications (pas par moi) traitant de la suppression des ombres de manière similaire.

  • Techniques de manipulation de domaine de gradient comme décrit ici (codes C et Matlab fournis): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html L'approche d'intégration de gradient peut être utilisée pour un certain nombre de traitements d'images problèmes, voir les diapositives / présentation pour d'autres exemples.

    L'idée générale:

    1. Calculez les dérivées spatiales (images en dégradé) pour tous les canaux de couleur.
    2. Utilisez les limites d'ombre du masque d'ombre pour générer un masque de poids qui est proche de zéro sur les limites d'ombre et augmente jusqu'à un dans un voisinage spécifié le long du bord d'ombre, c'est-à-dire orthogonal à un point de bord donné.
    3. Multipliez le masque de poids de (2.) avec toutes les images de dégradé pour réduire / atténuer les limites / bords d'ombre.
    4. Intégrez les images de dégradé en utilisant le code du lien ci-dessus.
    5. Pour les images RVB, d'après mon expérience, calculez la moyenne des canaux séparés des images originales et mettez à l'échelle les images intégrées pour qu'elles correspondent à ces valeurs afin d'éviter des artefacts de couleur «drôles».
  • Manipulation de la luminosité dans le domaine d'image d'origine.

    1. Utilisez le masque d'ombre pour générer un masque de poids qui est une région d'ombre extérieure, a une transition en douceur (vers le haut) à travers la frontière d'ombre et un facteur d'échelle supérieur à un à l'intérieur des régions d'ombre. Comme suggéré dans un article précédent, le facteur d'échelle peut être estimé à partir de la zone entourant immédiatement une zone d'ombre en utilisant la luminosité moyenne ainsi que la luminosité moyenne de la région d'ombre.
    2. Multipliez les images originales (par canal) avec le masque de poids, sous réserve de l'écrêtage.

J'ai également essayé d'utiliser différents modèles de couleurs, par exemple HSV, qui présentent directement la luminance ou la luminosité, qui peuvent ensuite être modifiées indépendamment de la couleur (teinte / saturation). Cela fonctionne essentiellement comme la manipulation de la luminosité, c'est-à-dire générer un masque de poids lisse et le multiplier par le canal de luminance. Peut-être que les deux approches, à savoir l'intégration du gradient et la manipulation de la luminosité, peuvent être combinées de manière intelligente, mais quelqu'un a probablement déjà essayé cela.

J'espère que ça aide, cordialement, Derik.

Dr.D.
la source
2
Le lien semble mort, voici une version en cache .
Delgan
9

J'ai déjà vu cette image. En fait , c'est ici dans le document même sur le sujet que vous cherchez à résoudre. Suivi d' un autre article du même groupe de recherche à l'Université Simon Fraser. Ces deux éléments vous donneront une bonne introduction au problème de la résolution des couleurs pour l'invariance d'éclairage.

tiluki
la source
oui je le sais mais essayais d'essayer une méthode différente pour le même problème
vini
@vini: Si vous avez lu que vous devez savoir ce que vous êtes contre --- les opérations morphologiques simples ne vont pas le couper. Qu'avez-vous lu et essayé d'autre? Je peux suggérer d'autres papiers si nécessaire.
Emre
@Emre j'essaye de changer la luminosité pour que l'effet de l'ombre diminue mais pas beaucoup de succès .. Une carte de bord peut-elle être utilisée pour masquer cette ombre en quelque sorte ... (matlab) pour supprimer l'ombre
vini
5
@vini: Ce problème dépasse les solutions à une ligne. Les articles liés (et il y en a d'autres aussi) résolvent déjà le problème dans la plupart des cas, donc si vous voulez faire quelque chose de nouveau, vous devrez trouver leurs faiblesses, et cela signifie les comprendre bien, donc je vous invite à les relire soigneusement. Ils mentionnent généralement des problèmes dans les sections Discussion et Conclusion. L'approche log-chromaticité illumination-projection invariante me semble la plus prometteuse ...
Emre
4

Il existe plusieurs méthodes qui parlent de la détection des ombres et fonctionnent essentiellement dans un contexte connu. Il n'y a pas de notion absolue de ce qu'est l' ombre rien qu'en regardant une couleur de pixel. Cependant, vous devez identifier l'ombre sans référence.

Bien que ce problème soit difficile, voici une solution triviale - bien que ce ne soit peut-être pas la meilleure, mais elle peut néanmoins vous aider à acquérir une certaine perspective.

Examinons les composants d'image dans le domaine HSL

Teinteest un composant de teinte, un composant de
Saturationsaturation et un Légèretécomposant de luminosité

Il est bien connu que la luminosité correspond étroitement à l'équivalent gris de l'image et que l'ombre est essentiellement

une région semi-transparente dans laquelle la réflexion de la scène subit une atténuation locale.

D' ici .

Par conséquent, c'est une superposition qui diminue la réflectance dans l'obscurité, vous pouvez l'identifier dans la partie grise de l'image - mais vous constaterez que son interaction est beaucoup moins dans les parties colorées (teinte et saturation à un peu).

Maintenant, ici, je suis capable de produire deux images - où

  1. Dans cette première image, nous avons supprimé le composant Lightness (remplacé par une valeur moyenne fixe)
    entrez la description de l'image ici

  2. Dans la deuxième image, nous avons supprimé le composant Saturation de la même manière Saturation supprimée

Nous pouvons voir que même si la luminosité est préservée mais que la saturation est supprimée, les informations critiques sur l'ombre sont intactes - où, comme lorsque nous avons supprimé la luminosité, les informations sur l'ombre sont considérablement réduites. Bien que ce ne soit pas parfait, il constitue une fonctionnalité clé qui vous permet de distinguer ce qui est vraiment une ombre de l'arrière-plan.

Sur cette base, vous pouvez traiter l'image "Légèreté supprimée" comme arrière-plan et une autre comme l'image incidente et segmenter l'image en fonction de ces deux informations; Ainsi, dans les régions où l'ombre ne joue pas un rôle majeur, la différence pourrait être beaucoup moins grande, où comme lorsque l'ombre existe, ce segment affichera une erreur élevée.

Alternativement, vous pouvez simplement appliquer une segmentation indépendante (telle qu'une croissance de région) sur les deux images. L'image supprimée par saturation aura un segment supplémentaire qui n'existera pas dans l'image supprimée par la luminosité qui n'est rien d'autre qu'un segment d'ombre.

Remarque: vous pouvez distinguer l'image HSL de légèreté supprimée de l'original lui-même. Essayez également les choses similaires avec l'espace colorimétrique HSV ainsi que YCbCr.

Dipan Mehta
la source
2

Vous pouvez prendre un histogramme de la zone masquée (l'ombre) et appliquer une transformation de couleur linéaire afin que l'histogramme de la zone masquée et du reste de l'image soit identique.

Je suppose que le facteur d'échelle dans la transformation serait négligeable, seul un décalage de la luminosité serait nécessaire, vous pouvez donc simplement prendre la luminosité moyenne des deux segments (ombre, entourage) et appliquer la différence.

Libor
la source