web-dev-qa-db-ja.com

OpenCVで2つの画像の違いを検出して視覚化するPython

2つの画像があるので、違いがどこにあるかを明確にしたいと思います。ユーザーが1〜2秒以内にすべての違いを明確に特定できるように、2つの画像に色を追加したいと思います。

たとえば、いくつかの違いがある2つの画像を次に示します。

leftImage.jpg:

first image

rightImage.jpg:

second image

違いを明確にするための私の現在のアプローチは、マスク(2つの画像の違い)を作成し、赤に着色してから、画像に追加することです。目標は、すべての違いを濃い赤色で明確に示すことです。これが私の現在のコードです:

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

現在のコードの問題:計算されたマスクにはいくつかの違いがありますが、すべてではありません(たとえば、右上隅にある小さな断片、または青いパケットに物足りないロープ)。これらの違いは、計算されたマスクではごくわずかしか表示されませんが、他の違いと同様にはっきりと赤く表示されます。

入力:2つの画像にいくつかの違いがあります。

予想される出力:3つの画像:2つの入力画像が、違いが強調表示されています(設定可能な色で明確に強調表示されています)。 (マスク)。

11
Anna Vopureta

最初の投稿にさらに2つ追加します。

  1. いくつかの違いは検出されませんでした
  2. 画像と画像が同じ場合のNoneの処理なし
  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