4

У меня есть куча изображений в папке, которая фактически представляет собой только части одного изображения, которое было разбито на перекрывающиеся части. Как быстро и программно рекомбинировать эти изображения для создания исходного изображения?Сшивание изображений с точным совпадением (пиксель-пиксель) перекрытий

Я бы предпочел решение, использующее python или mathematica (или существующее приложение), но я открыт и для других идей (я достаточно разбираюсь в Java).

+0

Другим вариантом использования будет скриншоты из 2D игр с прокруткой. Моя проблема в основном такая же, как и в [закрытом вопросе] (http://stackoverflow.com/questions/9104649/is-there-software-to-stitch-together-a-high-number-of-small -digital-images-witho) – Muhd

+0

Этот вопрос может быть полезен: http://mathematica.stackexchange.com/q/1911/121 –

ответ

0

Ну, мне больше не нужно делать это, чтобы делать то, что я хочу делать, но я расскажу, как бы это сделать, если бы я написал его в python (сочетание psuedocode и python). Здесь я предполагаю, что верхний левый угол последующих изображений всегда является точкой перекрытия (что было истинно в моем случае). Если вы хотите обнаружить перекрытия для любого угла, вам нужно будет определить, какой «угловой» случай (каламбур предназначен: D), в котором вы находитесь, и добавить обработку для каждого случая.

images = list of images to be stitched, loaded from directory 
stitched_image = images[0] 

for (image in images): 
    if first image then skip it (continue) 
    else combine_images(stitched_image, image) 

def combine_images (stitched_image, image_to_add): 
    top_left_corner = top left corner of image_to_add 
    // top_left_corner dimensions need to be big enough that you don't have a false positive, 
    // but not so big that the overlap doesn't exist 
    coordinates = find_coordinates(stitched_image,top_left_corner) 

    new_width = max(stitched_image.width,image_to_add.width + coordinates.x) 
    new_height = max(stitched_image.height,image_to_add.width + coordinates.y) 
    new_image = new Image(new_width,new_height) // See note 1 
    new_image.paste(stitched_image,(0,0)) 
    new_image.paste(image_to_add,(coordinates.x,coordinates.y)) 

    stitched_image = new_image 

def find_coordinates (image,sub_image): 
    // See note 2 for how to implement 

Примечания:

  1. Создание образа и вставки в него могут быть accomplised с PIL: http://29a.ch/2009/5/14/concatenating-images-using-python

  2. Смотрите этот вопрос о том, как найти sub_image в изображении (возможно, потребуется для преобразования изображения в другое представление): Finding a subimage inside a Numpy image.Кроме того, для любого опытного программиста было бы нелегко вручную проверять пиксели в матрице пикселей, чтобы найти перекрытие. Вы можете добавить дополнительную оптимизацию, если вы знаете грубую информацию о том, где совпадение, вероятно, произойдет, просто сначала в более вероятных областях.

0

Что вы хотите, это инструмент для создания панорам. Для этого используются различные инструменты с различными функциями. Вещи, чтобы думать о том, являются:

  1. согласования позиции по вертикали и по горизонтали
  2. различной яркости между изображениями
  3. исправляющих для поворота камеры и угла
+0

Хотя инструменты панорамы будут работать (вроде), большинство или все из них выполняют смешение, которое не то, что я хочу. Кроме того, они не оптимизированы для моего варианта использования, где пиксели точно соответствуют определенной области обоих изображений. – Muhd

0

Вы намерены использовать конкретное решение Java? Если вы открыты для чего-то другого, я делаю что-то подобное для проекта и придумал набор сценариев bash для Linux.

Для этого я использовал

  1. Hugin и Хугин-инструменты из репозиториев Ubuntu
  2. Panotools Perl оболочки скрипты
  3. This guide, чтобы получить функциональные возможности генерации работы через командную строку. В примере pto_gen не существует после установки hugin, но заменен моим match-n-shift в сценариях Panotools.

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

Прямо сейчас, используя 4-ядерную систему Xeon с 4 ГБ оперативной памяти, сшивание 50 изображений панорамы 360 градусов занимает ~ 30-45 минут.

+0

Более сложное и трудоемкое, чем то, что мне нужно. Мне нужно что-то, что просто находит подходящую строку или столбец пикселей и contatenates в этой точке. – Muhd

0

В Mathematica, вы можете использовать ImageCorrespondingPoints в пределах области перекрытия, а затем FindGeometricTransform вычислить аффинное преобразование, который принимает одно изображение в другое. Обратите внимание, что размер изображений и областей перекрытия влияет на точность преобразования. Если вы делаете что-то сложное (например, комбинируя спутниковые изображения), вам понадобится общая геометрическая модель для результата, а затем сопоставьте каждое изображение с ней. В таких случаях аффинное преобразование может оказаться недостаточным.

 Смежные вопросы

  • Нет связанных вопросов^_^