Поиск по части изображения и выделение отличий изображений OpenCv, Pyhton

Доброго вечера / ночи / утра / дня!

Задача: есть файл jpg с макетом кофе

[![Что мы отправляем][1]][1]

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

Что мы получаем

Нам надо проверить, всё ли ок, поэтому мы в фотошопе накладываем одно изображение на другое и если видим, что информация поехала, выдвигаем претензии к типографии, они правят, мы снова проверяем и согласовываем. На примере видно, что информация немного уехала верх

Проверка

Вопрос: можно ли как-то с помощью OpenCv или Pillow автоматизировать этот процесс? Получается, нужно: определить область, на которую нужно накладывать фото, наложить фото, подсветить разночтения. Проблема в том, что бланки типографии всегда разные. Размеры jpg для проверки и нашего jpg отличаются.

Вот такое решение https://pysource.com/2018/07/20/find-similarities-between-two-images-with-opencv-and-python/ кажется слишком обобщённым, нам нужно конкретно указывать, что в макете стоит не на своём месте

Здесь https://alex-siew.livejournal.com/1933.html чувствуется что-то нужное, но задавать координаты для поиска фрагмента кажется неудобным, потому что всю эту историю хочется провернуть через телеграмм бот

Просто подсветить отличия на макетах (других, не кофе), размеры которых 1 в 1 совпадают - получилось с помощью кода:

from PIL import Image, ImageChops

maket_1=Image.open('test1.jpg')
maket_2=Image.open('test2.jpg')

result=ImageChops.difference(maket_1, maket_2)
result.show()

print(result.getbbox())
result.save('result.jpg')

Проверка


Ответы (1 шт):

Автор решения: LHARTZ

В целом вот такая история работает, только необходимо, чтобы элементы макета были одинакового размера. Условно, EAC 200 пикселей должен быть и у нас и у файла из типографии. Сами картинки могут отличаться по высоте и ширине. Так как ищем по элементу EAC, то размещаем его в директорию и анализируем картинку.

Шаг 1

Ищем EAC на макете.

origin = imread(r"./Adaptation/Origin.png") #оригинал
EAC = imread(r"./Adaptation/EAC.png") #значок EAC, по которому сравниваем макеты
heat_map = matchTemplate(origin, EAC, TM_CCOEFF_NORMED)

#вычисляем координаты значка на нашем макете
h, w, _ = EAC.shape 
y, x = np.unravel_index(np.argmax(heat_map), heat_map.shape) 

Тоже самое делаем с файлом, который нам присылают из типографии.

adaptation = imread(r"./Adaptation/Adaptation.png")
EAC = imread(r"./Adaptation/EAC.png")
heat_map = matchTemplate(adaptation, EAC, TM_CCOEFF_NORMED)

#вычисляем координаты значка на файле из типографии
h_a, w_a, _ = EAC.shape 
y_a, x_a = np.unravel_index(np.argmax(heat_map), heat_map.shape) 

Шаг 2

Сравниваем положение знаков EAC по координатам на двух макетах (не самый изящный код):

if x > x_a:
    move_x_orig = x - x_a
else:
    move_x_orig = 0

if x_a > x:
    move_x_adapt = x_a - x
else:
    move_x_adapt = 0

if y > y_a:
    move_y_orig = y - y_a
else:
    move_y_orig = 0

if y_a > y:
    move_y_adapt = y_a - y
else:
    move_y_adapt = 0

Шаг 3

Теперь обрезаем картинки так, чтобы положение значков EAC было одинаковым

orig_check = Image.open(r"./Adaptation/Origin.png")
adapt_check = Image.open(r"./Adaptation/Adaptation.png")

width_a, height_a = adapt_check.size
width_o, height_o = orig_check.size

#Обрезаем картинки по вычисленным координатам
cropped_orig = orig_check.crop((move_x_orig, move_y_orig, x + width_o, y + 
height_o))
cropped_adapt = adapt_check.crop((move_x_adapt, move_y_adapt, x + width_a, y + 
height_a))

#накладываем макеты друг на друга в режиме наложения
result = ImageChops.multiply(cropped_adapt, cropped_orig) 

Если элементы макета разных размеров и не совпадают с EAC, то вся проверка срывается. Наложенные друг на друга элементы не отображают ничего существенного. Буду искать дальше, как можно решить эту задачу

→ Ссылка