web-dev-qa-db-fra.com

Détectez et visualisez les différences entre deux images avec OpenCV Python

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:

first image

rightImage.jpg:

second image

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:

enter image description here

diffOverImage1.png

enter image description here

diffOverImage2.png

enter image description here

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).

11
Anna Vopureta

J'ajoute deux autres choses pour le premier post:

  1. Une différence n'a pas été détectée
  2. Aucune manipulation de None pour les images et si les images sont identiques
  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
`


0
Denys Iaremenko