Очень трудно помочь, так как мы не знаем, какие параметры вы можете изменить, например, можете ли вы сохранить свою камеру фиксированной? Это всегда будет только о трубах? А как насчет цветов труб?
Тем не менее, я думаю, что вы ищете, это фреймворк для регистрации изображений, и я предлагаю вам использовать SimpleElastix . Он в основном используется для медицинских изображений, поэтому вам, возможно, придется ознакомиться с библиотекой SimpleITK. Что интересно, у вас много параметров для контроля регистрации. Я думаю, что вам придется заглянуть в документацию, чтобы узнать, как управлять определенной частотой c изображения, той, которая создает волны и деформирует изображения. В дальнейшем я не настроил его на достаточное локальное искажение, вам нужно будет найти лучший компромисс, но я думаю, что он должен быть достаточно гибким.
В любом случае, вы можете получить такой результат с помощью следующего кода Я не знаю, поможет ли это, надеюсь, что так:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import SimpleITK as sitk
fixedImage = sitk.ReadImage('1.jpg', sitk.sitkFloat32)
movingImage = sitk.ReadImage('2.jpg', sitk.sitkFloat32)
elastixImageFilter = sitk.ElastixImageFilter()
affine_registration_parameters = sitk.GetDefaultParameterMap('affine')
affine_registration_parameters["NumberOfResolutions"] = ['6']
affine_registration_parameters["WriteResultImage"] = ['false']
affine_registration_parameters["MaximumNumberOfSamplingAttempts"] = ['4']
parameterMapVector = sitk.VectorOfParameterMap()
parameterMapVector.append(affine_registration_parameters)
parameterMapVector.append(sitk.GetDefaultParameterMap("bspline"))
elastixImageFilter.SetFixedImage(fixedImage)
elastixImageFilter.SetMovingImage(movingImage)
elastixImageFilter.SetParameterMap(parameterMapVector)
elastixImageFilter.Execute()
registeredImage = elastixImageFilter.GetResultImage()
transformParameterMap = elastixImageFilter.GetTransformParameterMap()
resultImage = sitk.Subtract(registeredImage, fixedImage)
resultImageNp = np.sqrt(sitk.GetArrayFromImage(resultImage) ** 2)
cv2.imwrite('gray_1.png', sitk.GetArrayFromImage(fixedImage))
cv2.imwrite('gray_2.png', sitk.GetArrayFromImage(movingImage))
cv2.imwrite('gray_2r.png', sitk.GetArrayFromImage(registeredImage))
cv2.imwrite('gray_diff.png', resultImageNp)
Ваше первое изображение изменено до 256x256:
Ваше второе изображение:
Ваше второе изображение, зарегистрированное под первым:
Вот разница между первым и вторым изображением, которое могло показать, что отличается: