Сравнение двух изображений на основе формы и цвета - PullRequest
1 голос
/ 27 марта 2020

В настоящее время я работаю над python сценарием, где я сравниваю изображение (скриншот), которое я делаю, а затем обрезаю его вокруг моей мыши. Затем сравните это изображение с «библиотекой / базой данных» изображений в папке, затем он возвращает наиболее похожее изображение и находит правильные данные для этого изображения, для которого я создал базу данных Json.

В основном Я пытаюсь выяснить, что делает конкретный элемент c в популярной игре «The Binding Of Isaa c». Я снимаю изображение с экрана и, как сказано, сравниваю его с библиотекой изображений. Затем найдите в базе данных .json имя этого изображения и выясните, что оно делает. В настоящее время я использую метод cv2.matchTemplate() от openCV, проблема в том, что этот метод сравнивает только фигуры, а не цвета. В упомянутой игре много похожих фигур, и самое большое отличие - это цвет. Поэтому я подумал, какой метод / функцию мне следует использовать для этого.

Извините за плохую грамматику, английский sh не мой родной язык.

Image captured and cropped from the game Default Image Метод обрезки изображения:

def crop_image(image_path):
sprite = cv2.imread(image_path)

sprite_resized = cv2.resize(sprite,(0,0),fx=10,fy=10) # resize for visualisation purposes

sprite_gray  = cv2.cvtColor(sprite_resized, cv2.COLOR_BGR2GRAY)

sprite_canny = cv2.Canny(sprite_gray, 60,30,3,3) # <- play around with these params.
sprite_canny = sprite_canny.astype(np.bool) # is now a masked array

# because sprite_canny is a masked array, we can change the pixels in the sprite_resized
# to a different color to display the result. here the canny edges are shown in red
sprite_resized[sprite_canny] = (0,0,255)

# clever part: get the ranges of the bounding x and y coordinates. for this, we can use
# .any(axis = 0 or 1) to check if there's a point along the x or y axis. read as: "any
# point along axis 0 or 1?"
mx = sprite_canny.any(axis = 0)
my = sprite_canny.any(axis = 1)

# with this, we can get the range of x and y coordinate and get the min and max from them.
# to calculate the range, we need the width and height in pixels, accessed using .shape
h, w = sprite_gray.shape
rx = np.arange(w)[mx]
ry = np.arange(h)[my]

x_min = np.min(rx)
y_min = np.min(ry)

x_max = np.max(rx)
y_max = np.max(ry)
#COMMENT OUT RETURN TOO SE DEFAULT SCRIPT
return cv2.resize(sprite_gray[y_min:y_max, x_min:x_max], IMAGE_SIZE)
# use these coordinates to display a green rectangle around the found sprite
cv2.rectangle(sprite_resized, (x_min,y_min), (x_max,y_max), (0,255,0), 2)

Метод сравнения изображений:

def compare_images(image, library):
value = 0
max_value = 0
compared_image = str()

for file in os.listdir(library):
    template = f'{library}\\{file}'
    try:
        template = crop_image(template)
        value = cv2.matchTemplate(image, template, method=cv2.TM_CCOEFF)[0][0]
    except Exception: pass

    if value > max_value:
        max_value = value
        compared_image = file
return max_value, compared_image
...