Как вписать изображение прямо в самодельный алгоритм вращения в python - PullRequest
0 голосов
/ 21 ноября 2018

Я сам создал этот алгоритм на основе того, как вращать изображение.

import cv2
import math
import numpy as np

class rotation:
    angle = 60.0
    x = 100
    y = 100
    img = cv2.imread('FNAF.png',0)
    width,height = img.shape
    def showImage(name, self):
        cv2.imshow(name, self.img)
    def printWidthHeight(self):
        print(self.width)
        print(self.height)
    def rotateImage(self):
        ForwardMap = np.zeros((self.width,self.height),dtype="uint8")
        BackwardMap = np.zeros((self.width,self.height),dtype="uint8")

        for i in range(self.width):
            for j in range(self.height):
                # forward mapping
                for_x = (i - self.x) * math.cos(self.angle*(math.pi/180)) - (j - self.y) * math.sin(self.angle*(math.pi/180)) + self.x
                for_y = (i - self.x) * math.sin(self.angle*(math.pi/180)) + (j - self.y) * math.cos(self.angle*(math.pi/180)) + self.x
                for_x = int(for_x)
                for_y = int(for_y)
                # backward mapping should change the forward mapping to the original image
                back_x = (i - self.x) * math.cos(self.angle*(math.pi/180)) + (j - self.y) * math.sin(self.angle*(math.pi/180)) + self.x
                back_y = -(i - self.x) * math.sin(self.angle*(math.pi/180)) + (j - self.y) * math.cos(self.angle*(math.pi/180)) + self.x
                back_x = int(back_x)
                back_y = int(back_y)
                if for_x in range(self.width) and for_y in range(self.height):
                    ForwardMap[i, j] = self.img[for_x, for_y]
                else:
                    pass
                if back_x in range(self.width) and back_y in range(self.height):
                    BackwardMap[i, j] = self.img[back_x, back_y]
                else:
                    pass
        cv2.imshow('Forward Mapping', ForwardMap)
        cv2.imshow('Backward Mapping', BackwardMap)
def demo():
    rotation.showImage('normal', rotation)
    rotation.printWidthHeight(rotation)
    rotation.rotateImage(rotation)
    cv2.waitKey(0)
    cv2.destroyAllWindows

if __name__ == '__main__':
    demo()

Моя проблема заключается в том, что я хочу, чтобы повернутые изображения (как для прямого, так и для обратного отображения) соответствовали ТОЛЬКО так, чтобынет ненужного использования пространства.Кто-нибудь может мне помочь с этим?Очень признателен.

Если у вас есть предложения по оптимизации моего кода, не стесняйтесь комментировать и это.

1 Ответ

0 голосов
/ 23 ноября 2018

Исходное изображение имеет 4 угла, координаты: (0,0), (w-1, 0), (0, h-1) и (w-1, h-1).Поскольку ваше преобразование является аффинным, почему бы не преобразовать эти координаты в координаты назначения?

  • (0,0) → (x1, y1)
  • (w-1, 0) → (x2, y2)
  • (0, h-1) → (x3, y3)
  • (w-1, h-1) → (x4, y4)

Размер целевого изображения будет:

width  = max(x1, x2, x3, x4) - min(x1, x2, x3, x4)
height = max(y1, y2, y3, y4) - min(y1, y2, y3, y4)
...