Recherche d'un moyen de faire XOR bitwise sur les images
Je suis à la recherche d'un moyen d'obtenir la XOR au niveau du bit de deux images sur la ligne de commande(ou d'une autre manière qui peut être mis en œuvre dans un programme ou un script).
Ce qui devrait résulter en la même image finale que l'utilisation de la XOR mode de Fusion incrustation d'éditeurs qui le prennent en charge (Paint.NET, Photoshop, etc)
Comme un exemple, dire que j'ai Image de Une:
et Image B:
alors le résultat devrait ressembler à:
La partie la plus amusante de ce est, bien sûr, que lorsque vous XOR image C image B de nouveau, vous obtiendrez une copie exacte de l'image A.
Maintenant, j'ai été à la recherche partout sur l'internet un moyen de le faire par programmation, mais je n'ai rien trouvé. Même ImageMagick ne supporte pas de faire un XOR au niveau du bit sur les images.
Ne sombebody connais un moyen de faire cela?
source d'informationauteur Qqwy
Vous devez vous connecter pour publier un commentaire.
ImageMagick peut le faire, même si c'est un peu compliqué. Une façon est:
(
img1
,img2
,img_out
sont les deux signaux d'entrée et de sortie des noms de fichier, respectivement).Explication
C'est un peu moche (je suis sûr que quelqu'un avec plus d'ImageMagick-fu que moi n'est pas nettoyé, mais il fonctionne comme ceci:
-fx "xxx"
dit en gros "effectuer l'opérationxxx
sur l'image".Dans l'expression ci-dessus,
u
etv
stand pour la première et deuxième images d'entrée, respectivement.Maintenant,
-fx
seulement a bit à bit ET&
et bit à bit OU|
dans la voie des opérateurs au niveau du bit.Pour reconstruire XOR au niveau du bit, nous avons besoin de
Pour obtenir le
NOT
(il y a une logiqueNOT
mais pas au niveau du bitNOT
), nous nous souvenons queNOT x = 255-x
six
est de 8 bits.Donc, pour obtenir
NOT u
nous pouvons juste faire255-u
, en supposant que l'imageu
est de 8 bits.Par conséquent, la ImageMagick commande serait:
Le seul problème ici est que quand ImageMagick ne
fx
il normalise tous les pixels deu
etv
dans la gamme[0,1]
au lieu de[0,255]
comme nous le pensons, et de faire au niveau du bit sur des nombres non entiers vis des trucs.Par conséquent, nous devons multiplier tous occurrences de
u
etv
dans l'expression ci-dessus par 255 (de sorte que les opérations bit à bit de travail), et de diviser par 255 à la fin pour revenir dans la gamme[0,1]
que ImageMagick attend.Cela nous donne la commande d'origine,
Voila!
J'ai trouvé un besoin pour
xor
sur une image et de la G'MIC outil fonctionne pour moi. G'MIC est incroyablement puissant, comme l'est l'Image de la Magie, mais cela vaut le coup pour la résolution de certains difficiles problèmes de traitement de l'image.G'MIC travaille aussi directement sur les images postées ci-dessus.
Pour obtenir de l'aide,
Voici comment j'allais le faire en Java:
Parcourir tous les pixels des deux images à la fois. (pour la boucle (x) à l'intérieur d'une boucle for (y)). Bien sûr, utiliser un
BufferedImage
. Vous pouvez obtenir la couleur du pixel en faisant:Faire la même chose pour l'autre image et ainsi effectuer l'opération xor sur les deux couleurs. Stocker la valeur dans une nouvelle BufferedImage avec les mêmes dimensions que les deux images d'entrée.
Voici un exemple de code:
Pour charger une image à partir d'un fichier utilisation:
Si vous voulez le faire vous-même, faire pixel par pixel.
Si vous voulez une bibliothèque, je recommande
OpenCV
. C'est très joli et la bibliothèque open source avec d'énormes opérations soutenues dans le traitement de l'image de la zone. Il prend en charge directe XOR à l'aide de^
de l'opérateur.Bonne Chance.
Sachant que
A XOR B = (A ET NON B) OU (NON A ET B).
et que la plupart du commun des outils de traitement d'image ont et, ou et non des opérations le reste est assez facile 🙂
De travail en Python, vous pourriez avoir un simple script qui effectue l'opération, et même l'ajout d'un plugin gimp 😉
OpenCV a tous les opérateurs logiques sur les images et numpy images à l'aide de bitwise_# Où # peut être xor, et, et, ... Voir OpenCV - Intersection entre deux images binaires