Obtenez la différence entre deux images en tant qu'image transparente dans GIMP

21

J'ai deux images Aet Bqui sont similaires dans de nombreuses régions.

Je veux créer une image Cpour que

B = C on top of A

Cdevrait être aussi transparent que possible. on top ofest la superposition de couche normale.

Il Cy a donc une sorte de différence entre Aet B. Si Aet Bsont identiques, alors Cest totalement transparent. Si Aet Bsont très différents, alors leur Cserait presque identique à B.

cheesus SO arrête de nuire à Monica
la source
Il y a une excellente réponse à cette question sur Stack Overflow qui utilise ImageMagick: stackoverflow.com/questions/5132749/…
AB

Réponses:

23

Vous pouvez utiliser le mode de calque "différence" pour créer un masque de calque et l'appliquer à B comme ceci:

  1. Ouvrez les deux images sous forme de calques, A en bas, B en haut
  2. Dans la boîte de dialogue du calque, marquez le mode de calque B comme "différence". Vous devriez maintenant voir l'image principalement noire si les images se ressemblent, les zones colorées marquant les zones différentes. Ces couleurs, cependant, ne correspondront pas aux couleurs de B comme vous le souhaitez
  3. Édition-> Copie visible, pour obtenir une copie de l'effet calculé sur B
  4. Dupliquez le calque B, changez son mode en "Normal" (appelons ce calque C)
  5. Dans le menu Calques, ajoutez un masque de calque à C (Calque-> Masque-> Ajouter un masque de calque).
  6. Avec le masque sélectionné, collez le contenu copié à l'étape 3 (éditer-> coller).
  7. Ancrez le contenu collé sur le masque du calque (calque-> Calque d'ancrage)

Vous y êtes - rendez les couches A et B invisibles, et vous devriez être très proche de ce que vous voulez. D'autres opérations sur le masque de calque (je recommande d'utiliser Couleurs-> courbe) peuvent ajuster l'opacité / la transparence des zones du calque C.

mettre à jour j'ai récemment répondu à une question semblable à cela sur Stackoverflow, où l'OP voulait effectuer la tâche programatically ( en utilisant Python + Python-imagerie bibliothèque) - J'ai posté le programme complet sur cette question et il pourrait être utile pour tout le monde intéressé par cette réponse.

jsbueno
la source
On the layer's dialog, mark B's layer mode as "difference". Pardon quoi? Je regarde la fenêtre de l'outil Calques, et si je fais un clic droit sur le calque B, je ne vois rien qui ressemble à un layer mode. Le plus proche que j'ai trouvé est Add Layer Mask, mais je ne pense pas que c'est à cela que vous faites référence. Utilisation de la v2.8.22.
Adrian
avec le calque sélectionné, le mode de calque peut être choisi dans une liste déroulante en haut de la boîte de dialogue des calques, pas dans le menu contextuel.
jsbueno
J'ai un peu de confusion ou de problème avec l'étape 6 - il semble que le contenu soit collé dans un nouveau calque, même avec "Masque C" sélectionné, créant un quatrième calque nommé "Sélection flottante (calque collé)" qui est décalé de la position d'origine - est-ce que cela devrait ressembler?
Code Jockey
Il s'agit d'une "sélection flottante" jusqu'à ce que vous "l'ancrez" à sa destination (Ctrl-H). Assurez-vous que le masque est actif lorsque vous collez (Ctrl-V) sinon l'ancrage peut aller ailleurs.
xenoid
5

Il existe une méthode simple pour le faire:

Ouvrez les images en deux calques, exécutez Filtres - Animation - Optimiser (différence), vous devriez obtenir la même image résultante qui est maintenant faite du calque inférieur et d'un calque diff au-dessus.

Les choses ne se compliquent que si vous avez une transparence partielle, car le filtre la supprime.
Voici une solution de contournement que j'ai trouvée pour ce cas:

  • Supprimer le canal alpha sur les deux couches (l'action est dans le menu contextuel)

Les images recevront un fond blanc, mais ne vous inquiétez pas, nous l'annulerons plus tard.

  • Filtres - Animation - Optimiser (différence)

Maintenant, nous avons le calque de différence avec un fond blanc dans les endroits de transparence partielle, mais nous avons besoin de ces pixels pour être transparent, nous allons donc prendre la forme du diff et copier l'image de cette forme à partir du calque supérieur d'origine. Assurez-vous que la couche diff nouvellement générée est sélectionnée et continuez:

  • Calque - Calque à la taille de l'image
  • Édition - Copier (Ctrl + C)
  • Retour à l'image d'origine
  • Annuler, Annuler pour rendre la transparence à nos calques
  • Édition - Coller en tant que - Nouveau calque
  • Alpha à la sélection (dans le menu contextuel) sur le calque diff collé
  • Supprimer le calque diff collé
  • Assurez-vous que le calque supérieur est sélectionné et copiez-le (Ctrl + C)
  • Maintenant, vous avez le diff, il suffit de le coller (Ctrl + V) et de créer un nouveau calque à partir de celui-ci.

Bien sûr, aucune magie ne se produit, et la couche supérieure partiellement transparente ne modifiera pas les couleurs ou ne réduira pas la transparence de la couche inférieure, donc c'est uniquement pour les cas d'extension, où les pixels modifiés de la couche supérieure recouvrent la couche inférieure.


La méthode de PS jsbueno n'a pas fonctionné pour moi.

utilisateur
la source
1

GIMP dispose d'un mode pinceau nommé "Effacement des couleurs". L'application de ce pinceau, coloré avec la couleur X, au pixel P1 défini crée un pixel P2 avec un canal alpha abaissé, de la même manière que le mélange P2 avec le pixel avec la couleur X en mode normal donne le pixel P1. Le même effet, appliqué à la région sélectionnée ou à l'image entière peut être obtenu en utilisant l'action "Color to Alpha" .

Le mode pinceau peut également être appliqué à "Outil de clonage". Dans ce cas, il est possible de prendre la couleur des pixels de l'image d'arrière-plan A et de l'appliquer aux pixels correspondants de l'image résultante B. L'image qui reste est l'image souhaitée C.

Dans les détails, la création de l'image C est la suivante:

  1. Mettez les images A et B sous forme de calques (A sous B).
  2. Dupliquez l'image B et appelez-la C. Mettez-la entre A et B. Cachez l'image B.
  3. Choisissez "Clone Tool". Dans le volet "Options d'outils", définissez les options suivantes: Mode: "Effacer la couleur"; Pinceau: utilisez un pinceau rond pointu ("Dureté 100") Taille: agrandissez le pinceau pour peindre facilement toute l'image à la fois.
  4. Sélectionnez un calque et CTRL + en haut à gauche pour sélectionner un endroit à partir duquel cloner et mémoriser sa position (pour un zoom à 100% ce sera (1,1), pour 50% ce sera (2,2) etc.).
  5. Sélectionnez maintenant le calque C et commencez à peindre en haut à gauche et couvrez toute l'image sans lever le pinceau. Il peut sembler que l'image ne change pas. Mais si vous masquez le calque A, vous verriez que le calque C contient maintenant l'image souhaitée.
  6. Vérifiez le résultat: affichez le calque A et le calque C. Basculez la visibilité du calque B pour vous assurer que les images se ressemblent. (Vous pouvez également choisir le mode "Différence" pour le calque B, dans ce cas, vous devriez obtenir une image absolument noire.)

Remarque: Cette méthode fonctionne comme décrit si l'image d'arrière-plan est opaque. Sur les parties transparentes de l'image d'arrière-plan, le mélange de C en haut de A est différent de l'image B.

user2367602
la source