Проверить, является ли изображение является частью другого


У меня есть следующий код (слегка измененный для простоты). Он проверяет, является ли данный образ (шаблон) является частью другого изображения B. Для того чтобы обрабатывать различные размеры, изображение B масштабируется, пока не будет найдено совпадение или какой минимальный/максимальный размер изображения.

Наивная реализация этого довольно прямо вперед, но я не счастлива с ним:

  1. Код внутри двух петель практически идентична.

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

Вы можете предложить некоторые предложения о том, как улучшить мой код?

double bestMatch = 0;

while (image.width() > MIN_IMAGE_WIDTH) {
   match = match(image, template); // for the sake of simplicity let this return a double
   if (match > bestMatch) {
      bestMatch = match;
   }
   if (match.maxVal >= threshold) {
      foundMatch = true;
      break;
   }
   image = scaleImage(image, 0.9);
}

image = originalImage;
while (image.width() < MAX_IMAGE_WIDTH) {
   match = match(image, template);
   if (match > bestMatch) {
      bestMatch = match;
   }
   if (match.maxVal >= threshold) {
      foundMatch = true;
      break;
   }
   image = scaleImage(image, 1.1);
}

// do something with bestMatch


114
3
задан 3 апреля 2018 в 04:04 Источник Поделиться
Комментарии
1 ответ

Чтобы ответить на ваш второй вопрос:

Почему не включают foundMatch в состоянии while?

while (!foundMatch && image.width() < MAX_IMAGE_WIDTH) {

Таким образом, вы не выполните вторую петлю, если найдено совпадение в первом.


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


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

1
ответ дан 3 апреля 2018 в 07:04 Источник Поделиться