2つの画像があるので、違いがどこにあるかを明確にしたいと思います。ユーザーが1〜2秒以内にすべての違いを明確に特定できるように、2つの画像に色を追加したいと思います。
たとえば、いくつかの違いがある2つの画像を次に示します。
leftImage.jpg:
rightImage.jpg:
違いを明確にするための私の現在のアプローチは、マスク(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:
diffOverImage1.png
diffOverImage2.png
現在のコードの問題:計算されたマスクにはいくつかの違いがありますが、すべてではありません(たとえば、右上隅にある小さな断片、または青いパケットに物足りないロープ)。これらの違いは、計算されたマスクではごくわずかしか表示されませんが、他の違いと同様にはっきりと赤く表示されます。
入力:2つの画像にいくつかの違いがあります。
予想される出力:3つの画像:2つの入力画像が、違いが強調表示されています(設定可能な色で明確に強調表示されています)。 (マスク)。
最初の投稿にさらに2つ追加します。
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
`