Предыстория: у меня есть изображения, которые мне нужно сравнить на предмет различий. Изображения большие (порядка 1400x9000 пикселей), сгенерированные машиной и сильно ограниченные (скриншоты конкретной части линейного пользовательского интерфейса), и ожидается, что они будут почти идентичными, а различия заключаются в одной из следующих трех возможностей:
- На изображении 1 есть разрез, на изображении 2 отсутствует
- На изображении 1 отсутствует изображение раздела 2.
- Оба изображения имеют данный раздел, но его содержимое отличается
Я пытаюсь создать инструмент, который выделяет различия для человека-рецензента, по сути, графическую версию линейно-ориентированного diff. С этой целью я пытаюсь сканировать изображения построчно и сравнивать их, чтобы решить, идентичны ли строки. Моя конечная цель — фактический вывод, похожий на diff, где он может определить, что разделы отсутствуют/добавлены/отличны, и как можно скорее синхронизировать изображения для оставшихся частей идентичного контента, но для первого разреза я используя более простой подход, при котором два изображения накладываются друг на друга (альфа-смешение), а линии, которые были разными, выделяются определенным цветом (т.е. альфа-смешение с третьей строкой сплошного цвета). Сначала я пытался использовать Python Imaging Library, но это было на несколько порядков медленнее, поэтому я решил попробовать использовать vips
, который должен быть намного быстрее. Однако я совершенно не представляю, как выразить то, чем я являюсь после использования операций vips
. Псевдокод для более простой версии будет по существу:
out = []
# image1 and image2 are expected, but not guaranteed to have the same height
# they are likely to have different heights if different
# most lines are entirely white pixels
for line1, line2 in zip(image1, image2):
if line1 == line2:
out.append(line1)
else:
# ALL_RED is a line composed of solid red pixels
out.append(line1.blend(line2, 0.5).blend(ALL_RED, 0.5))
Я использую pyvips
в своем проекте, но меня также интересует код с использованием простого vips
или любых других привязок, поскольку операции являются общими и легко переводятся для разных диалектов.
Изменить: добавление образцов изображений по запросу
Редактировать 2: полноразмерные изображения с отсутствующими/добавленными/измененными разделами: