У меня следующая проблема, у меня есть пара из двух изображений: одно историческое и одно современное спутниковое изображение, и поскольку историческое изображение охватывает меньшую область, я хочу обрезать спутниковые изображения. Здесь можно увидеть код, который я написал для этого:
import numpy as np
import cv2
import os
import imutils
import math
entries = os.listdir('../')
refImage = 0
histImages = []
def loadImage(index):
referenceImage = cv2.imread("../" + 'ref_' + str(index) + '.png')
top = int(0.5 * referenceImage.shape[0]) # shape[0] = rows
bottom = top
left = int(0.5 * referenceImage.shape[1]) # shape[1] = cols
right = left
referenceImage = cv2.copyMakeBorder(referenceImage, top, bottom, left, right, cv2.BORDER_CONSTANT, None, (0,0,0))
counter = 0
for entry in entries:
if entry.startswith("image_"+str(index)):
refImage = referenceImage.copy()
histImage = cv2.imread("../" + entry)
#histImages.append(img)
points = np.loadtxt("H2OPM/"+"CP_"+ entry[6:9] + ".txt", delimiter=",")
vector_image1 = [points[0][0] - points[1][0], points[0][1] - points[1][1]] #hist
vector_image2 = [points[0][2] - points[1][2], points[0][3] - points[1][3]] #ref
angle = angle_between(vector_image1, vector_image2)
hhist, whist, chist = histImage.shape
rotatedImage = imutils.rotate(refImage, angle)
x = int(points[0][2] - points[0][0])
y = int(points[1][2] - points[1][0])
crop_img = rotatedImage[x+left:x+left+hhist, y+top:y+top+whist]
print("NewImageWidth:", (y+top+whist)-(y+top),(x+left+hhist)-(x+left))
print(entry)
print(x,y)
counter += 1
#histImage = cv2.line(histImage, (points[0][0], ), end_point, color, thickness)
cv2.imwrite("../matchedImages/"+'image_' + str(index) + "_" + str(counter) + '.png' ,histImage)
#rotatedImage = cv2.line(rotatedImage, (), (), (0, 255, 0), 9)
cv2.imwrite("../matchedImages/"+'ref_' + str(index) + "_" + str(counter) + '.png' ,crop_img)
Сначала я загружаю исходное спутниковое изображение и дополняю его, чтобы не потерять информацию из-за поворота, во-вторых, я загружаю один из сопоставленные исторические изображения, а также совпадающие ключевые точки двух изображений (то есть список x_hist, y_hist, x_present_day, y_present_day). В-третьих, я вычисляю угол поворота между двумя изображениями (который работает), и в-четвертых, я обрезаю изображение (и в-пятых, я сохраняю изображения).
Проблема : Как указано вращение работает нормально, но моя программа обрезает неправильную часть изображения.
Я думаю, что из-за поворота границы (то есть слева, справа, сверху, снизу) больше не правильные, и я думаю, Вот где моя проблема, но я не уверен, как решить эту проблему.
Информация, которая может помочь:
- Оба изображения масштабированы таким же образом (таким образом, один пиксель = прибл. 1 м)
- У меня есть как минимум 6 ключевых точек для каждого изображения