Инструменты командной строки для сопоставления похожих частей изображения - PullRequest
3 голосов
/ 09 декабря 2011

У меня есть несколько тысяч отсканированных изображений, которые я пытаюсь обрезать.Я пишу сценарий, который будет соответствующим образом обрезать изображения, если я смогу определить, является ли исходное изображение изображением 3х5 или изображением 4х6 с обрезанной границы (крышка сканера).

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

convert img1.jpg  "img2.jpg" -compose difference -composite -colorspace gray miff:- | identify -verbose - | sed -n '/^.*mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc

(обычно это совпадение, еслирезультат <.10, но он интенсивно использует процессор) </p>

Существует ли инструмент или библиотека изображений Python, которые позволят мне сопоставить определенные области из двух изображений, чтобы увидеть, совпадают ли они?Незарезанные области не являются чисто белыми, о чем свидетельствуют приведенные ниже примеры изображений (1 3x5, 1 4x6).Все, что мне нужно для сопоставления, это первые 100 пикселей или около того, и, очевидно, я не могу сопоставить все изображение.Я подумал о копировании и обрезке изображения и сопоставлении кадрирования с эталонным изображением, но это кажется неоптимальным.

enter image description here

enter image description here

1 Ответ

2 голосов
/ 09 декабря 2011

Я не знаю о существовании какого-либо инструмента командной строки для этого, но было бы довольно тривиально написать свой собственный, используя numpy.Основная процедура будет такой:

  1. Поместите простое изображение загрузки крышки сканера в ndarray.
  2. Загрузите каждую фотографию / изображение в массиве.
  3. Сравните значительную часть из двух и назначьте оценку.
  4. Если оценка выше вашего порога ...

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

Реализация концепции numpy part:

>>> import numpy as np
>>> scanner_lid = np.ones((5, 5))
>>> scanner_lid
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])
>>> photo = np.random.randint(0, 2, (5, 5))
>>> photo
array([[0, 0, 1, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 0, 1, 1, 1],
       [1, 1, 0, 0, 1],
       [1, 0, 1, 1, 1]])
>>> matching_pixels = scanner_lid[0:2, 0:2] == photo[0:2, 0:2]  #compare the top-left 4 pixels
>>> matching_pixels
array([[False, False],
       [False,  True]], dtype=bool)
>>> np.sum(matching_pixels)
1

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

HTH!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...