Сравните изображения для нахождения различий

Задача: Мне смонтировали камеру на конце нашего сборочного конвейера, который получает изображения произведенных объектов. Давайте, например, скажем, что мы производим билеты (с некоторым текстом и изображениями на них). Таким образом, каждый произведенный билет сфотографирован и сохранен на диск как изображение. Теперь я хотел бы проверить эти сохраненные образы на аномалии (т.е. сравнить их с изображением (шаблон), который в порядке). Таким образом, если существует проблема с билетом на нашем сборочном конвейере (недостающее изображение, окраска...), мое приложение должно найти его (потому что его изображение отличается слишком много от моего шаблона).

Вопрос: Что самый легкий путь состоит в том, чтобы сравнить изображения и найти различиями между ними? Я должен записать свои собственные методы, или я могу использовать существующие? Было бы замечательно, если бы я просто установил значение допуска (т.е. изображения могут отличаться для 1%), поместите оба изображения в функцию и получите возвращаемое значение TRUE или FALSE :)

Инструменты: C# или VB.NET, Emgu. CV (обертка.NET для OpenCV) или что-то подобное

8
задан S.L. Barth - Reinstate Monica 25 July 2012 в 07:53
поделиться

5 ответов

Я бы порекомендовал посмотреть Библиотеку AForge Imaging , так как в ней есть много действительно полезных функций для этого типа работы.

Есть несколько методов, которые вы можете использовать:

  1. Простое вычитание (изображение шаблона - текущее) и посмотреть, сколько пикселей отличается. Вероятно, вы захотите установить порог результатов, то есть включать только пиксели, которые отличаются на 10 или более (например).
  2. Если билеты могут перемещаться в поле зрения, то пункт 1) не будет работать, если вы не сможете сначала найти билет. Например, если билет белый на черном фоне, вы можете установить порог на изображении, и это даст вам хорошее представление о том, где находится билет.
  3. Еще один метод, который я использовал раньше, - это «Поиск модели» или «Сопоставление с образцом», но я знаю только коммерческую библиотеку Matrox Imaging Library (или MIL), которая содержит эти функции в том виде, в каком они есть. нетривиально.

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

2
ответ дан 5 December 2019 в 18:58
поделиться

Я мало знаю об OpenCV, но немного разбираюсь в обработке изображений.

Дальнейший путь зависит от частоты создания новых снимков. Упрощенный подход заключался бы в том, чтобы вычислить разницу между вашим «хорошим» шаблоном и изображением вашего реального продукта.

Если изображения на 100% идентичны, полученное изображение должно быть пустым. Если есть остаточные пиксели, их можно посчитать и принять как меру отклонения от нормы.

Однако вам нужно будет сопоставить ориентацию (и, возможно, масштаб) одного из изображений, чтобы выровнять его границы, иначе этот подход не будет работать.

Если у вас есть временные ограничения, вы можете уменьшить информацию в ваших изображениях перед их обработкой (используя, например, обнаружение краев и / или преобразовать их в оттенки серого или даже в монохроматическое растровое изображение, если возможности вашего продукта достаточно значительны)

3
ответ дан 5 December 2019 в 18:58
поделиться

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

Предполагая, что вы контролировали одинаковые ориентации и позиционирование объектов на изображениях, вы могли сделать одну вещь - пройтись по пикселям каждого изображения и получить значения HSV каждого из них. :

Color color1 = Image1.GetPixel(i,j);
Color color2 = Image2.GetPIxel(i,j);
float hue1 =    color1.GetHue();
float sat1 =    color1.GetSaturation();
float bright1 = color1.GetBrightness();
float hue2 =    color2.GetHue();
float sat2 =    color2.GetSaturation();
float bright2 = color2.GetBrightness();

и сравните с этими значениями.Я думаю, это позволит вам сравнивать их с большей надежностью, чем использование значений RGB, тем более что вы хотите включить некоторые допуски в свое сравнение.


Редактировать:

Ради удовольствия я написал небольшой пример приложения, в котором использовалась моя идея, описанная выше. По сути, он суммировал количество пикселей, значения H, S и V которых различались на некоторую величину (я выбрал 0,1 в качестве значения), а затем выпадал из циклов сравнения, если счетчики H, S или V превышают 38400 или 2% от пикселей (0,02 * 1600 * 1200). В худшем случае на сравнение двух одинаковых изображений уходило около 2 секунд. Когда я сравнивал изображения, в которых одно было изменено достаточно, чтобы превысить это значение в 2%, обычно это занимало доли секунды.

Очевидно, это было бы слишком медленно, если бы в секунду создавалось много изображений, но я все равно подумал, что это интересно.

1
ответ дан 5 December 2019 в 18:58
поделиться

Я не знаю подробностей, но знаю, что в промышленных ситуациях, когда важна высокая пропускная способность, это иногда делается с помощью нейронных сетей. Они превращают миллионы бит (пикселей камеры) в 1 (хорошие или плохие). Может быть, это поможет вам в поиске.

1
ответ дан 5 December 2019 в 18:58
поделиться

Я не специалист в этой области, но похоже, что вам нужно что-то вроде этого

http: // en.wikipedia.org/wiki/Template_matching

И похоже, что OpenCV поддерживает сопоставление шаблонов
http://nashruddin.com/template-matching-in-opencv-with-example.html

1
ответ дан 5 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: