J'ai deux images et je voudrais montrer où sont les différences. Je veux ajouter de la couleur aux deux images afin qu'un utilisateur puisse clairement repérer toutes les différences en une ou deux secondes.
Par exemple, voici deux images avec quelques différences:
leftImage.jpg:
rightImage.jpg:
Mon approche actuelle pour rendre les différences évidentes est de créer un masque (différence entre les deux images), de le colorer en rouge, puis de l'ajouter aux images. L'objectif est de marquer clairement toutes les différences avec une couleur rouge forte. Voici mon code actuel:
import cv2
# load images
image1 = cv2.imread("leftImage.jpg")
image2 = cv2.imread("rightImage.jpg")
# compute difference
difference = cv2.subtract(image1, image2)
# color the mask red
Conv_hsv_Gray = cv2.cvtColor(difference, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(Conv_hsv_Gray, 0, 255,cv2.THRESH_BINARY_INV |cv2.THRESH_OTSU)
difference[mask != 255] = [0, 0, 255]
# add the red mask to the images to make the differences obvious
image1[mask != 255] = [0, 0, 255]
image2[mask != 255] = [0, 0, 255]
# store images
cv2.imwrite('diffOverImage1.png', image1)
cv2.imwrite('diffOverImage2.png', image1)
cv2.imwrite('diff.png', difference)
diff.png:
diffOverImage1.png
diffOverImage2.png
Problème avec le code actuel: Le masque calculé montre quelques différences mais pas toutes (voir par exemple le petit morceau dans le coin supérieur droit, ou le truc de corde sur le paquet bleu). Ces différences n'apparaissent que très légèrement dans le masque calculé, mais elles doivent être clairement rouges comme les autres différences.
Entrée: 2 images avec quelques différences.
Sortie attendue: 3 images: les deux images d'entrée mais avec les différences mises en évidence (clairement mises en évidence dans une couleur configurable), et une troisième image contenant uniquement les différences (le masque).
J'ajoute deux autres choses pour le premier post:
import cv2
def find_difference_2(template: str, current: str) -> bool:
"""
This function is created to find a difference between two images
:param template: path to template image
:param current: path to current state of the app
:return: bool Is images different
"""
different_images = False
# load images
image1 = cv2.imread(template)
image2 = cv2.imread(current)
assert image1 is not None, "Template is not found"
assert image2 is not None, "Current image is not found"
# compute difference
difference = cv2.subtract(image1, image2)
# color the mask red
Conv_hsv_Gray = cv2.cvtColor(difference, cv2.COLOR_BGR2GRAY)
# add contrast to image
# THIS ONE IS VERY IMPORTANT NOT TO LOSE ALL DIFFERENCE
Conv_hsv_Gray[Conv_hsv_Gray != 0] = 255
ret, mask = cv2.threshold(Conv_hsv_Gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
# Check that images are different, if images are same then f returns False
if cv2.countNonZero(Conv_hsv_Gray):
print("Not the same")
different_images = True
image2[mask != 255] = [0, 0, 255]
cv2.imwrite("image_2_with_dif.png", image2)
else:
print("Images are same")
return different_images
`