Я хочу преобразовать (перевести, повернуть и масштабировать) изображение на основе 3 точек, определенных на обоих перекрывающихся изображениях. Основываясь на координатах пикселей трех точек, я хочу создать большой tiff, который объединяет их. Для следующего наложения я хочу сделать то же самое и т. д., пока не получу большой tiff, который объединяет все изображения. Это немного похоже на географическую привязку, но без использования координат. Проблема в том, что у меня нет опыта работы с matplotlib. До сих пор я создал скрипт, который показывает каждую пару перекрывающихся изображений рядом, и когда я закрываю окно, открывается следующая пара и т. д. Мне также удалось получить координаты пикселей из точек, на которые были нажаты эти изображения. Но теперь я должен начать трансформацию, основанную на 3 пунктах, и я просто не знаю, с чего начать. Любая помощь по полезным функциям и т. д.?

РЕДАКТИРОВАТЬ: изображения представляют собой тепловые изображения с низким разрешением, поэтому я не думаю, что автоматические преобразования будут работать.

1
Jan-Pieter Van Parys 11 Ноя 2019 в 12:45
Я предполагаю, что вам нужно выполнить некоторые математические операции с необработанными данными, возможно, используя что-то вроде numpy
 – 
Ofer Sadan
11 Ноя 2019 в 12:49
1
OpenCV - это то, что вы ищете. Я не помню точных функций, но если вы знаете 3 точки на обоих изображениях, он может вычислить аффинное преобразование (перевести + повернуть + масштабировать, не ошибитесь с перспективой, для которой требуется больше точек) и преобразовать изображение и наложить его на целевое изображение все в одна линия.
 – 
IcedLance
11 Ноя 2019 в 13:02
Спасибо дружище, будем разбираться!!
 – 
Jan-Pieter Van Parys
11 Ноя 2019 в 13:06
Возможно, на более позднем этапе процесса я смогу использовать его, но для преобразования это не кажется подходящей библиотекой. Спасибо
 – 
Jan-Pieter Van Parys
11 Ноя 2019 в 13:07

1 ответ

Вы можете использовать wand, который является привязкой Python к ImageMagick. Итак, начнем с этого изображения:

enter image description here

Мы можем исказить красную вершину (138,80) в верхний левый угол, зеленую (43,22) в нижний левый и синюю (49,125) в нижний правый угол следующим образом (изображение 152x152):

#!/usr/bin/env python3

from wand.image import Image

# Open image and distort, giving start x,y and end x,y for 3 points
with Image(filename='start.png') as img:
    points = (138, 80, 0, 0,        # Red vertex
               43, 22, 0,152,       # Green vertex
               49,125, 152,152)     # Blue vertex
    img.distort('affine',points)

    # Save result
    img.save(filename='result.png')

enter image description here


Вы можете сделать то же самое в Терминале из командной строки:

magick start.png -distort affine "138,80 0,0 43,22 0,152 49,125 152,152" result.png

Ключевые слова: обработка изображений, Python, искажение, искажение, аффинное преобразование, преобразование, масштабирование, поворот, ImageMagick.

1
Mark Setchell 11 Ноя 2019 в 15:52
Выглядит многообещающе, тоже попробую! Большое спасибо!
 – 
Jan-Pieter Van Parys
11 Ноя 2019 в 16:43
У меня есть вопрос, если я перевожу координаты из небольшого диапазона, например. 1,1 к большему, например. 40,40; будет ли он заполнять нижние значения значением nodata, например 0? Это то, что мне нужно. Изображение может облегчить понимание: drive.google.com /file/d/1TIv31ws0-k05vSIXYV8vwTqwYQMIaqKl/…
 – 
Jan-Pieter Van Parys
11 Ноя 2019 в 17:42
Я не понимаю, что вы имеете в виду. Я предоставил код, так что, возможно, просто попробуйте — ImageMagick установлен в большинстве дистрибутивов Linux и доступен бесплатно для macOS и Windows. Или добавьте свои изображения в свой вопрос, чтобы я мог попробовать все, что вы хотите сделать. Спасибо.
 – 
Mark Setchell
11 Ноя 2019 в 17:49
В Imagemagick вы можете управлять значениями пикселей, которые находятся за пределами входного изображения, поскольку они преобразуются в выходные данные с помощью -virtual-pixel xxx. У вас есть много вариантов: значения цвета или дубликат, зеркальное отображение или мозаика и т. Д., Чтобы заполнить недостающие данные в выходных данных.
 – 
fmw42
11 Ноя 2019 в 20:38
Вы также можете выполнять аффинные преобразования из 3 точек в Python/OpenCV. См. opencv-python-tutroals.readthedocs.io /en/latest/py_tutorials/…
 – 
fmw42
11 Ноя 2019 в 20:39