Поиск по части изображения и выделение отличий изображений OpenCv, Pyhton
Доброго вечера / ночи / утра / дня!
Задача: есть файл jpg с макетом кофе
Мы отправляем его в типографию, типография присылает нам другую картинку, на которой помимо маета есть всякая разная тех. инфо.
Нам надо проверить, всё ли ок, поэтому мы в фотошопе накладываем одно изображение на другое и если видим, что информация поехала, выдвигаем претензии к типографии, они правят, мы снова проверяем и согласовываем. На примере видно, что информация немного уехала верх
Вопрос: можно ли как-то с помощью 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 шт):
В целом вот такая история работает, только необходимо, чтобы элементы макета были одинакового размера. Условно, 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, то вся проверка срывается. Наложенные друг на друга элементы не отображают ничего существенного. Буду искать дальше, как можно решить эту задачу
![[![Что мы отправляем][1]][1]](https://i.stack.imgur.com/eDWok.png)


