ACommonDane01
ACommonDane01

Reputation: 11

How to fit image right in homemade rotation algorithm in python

I have made this algorithm myself based on how to rotate an image.

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()

My problem is now that I want to make the rotated pictures (both for forward and backwards mapping) fit JUST right so there is no unnecessary use of space. Can anybody help me with this? Much appreciated.

If you have any suggestions to optimize my code, feel free to comment on that as well.

Upvotes: 0

Views: 427

Answers (1)

AJNeufeld
AJNeufeld

Reputation: 8705

Your original image has 4 corners, coordinates: (0,0), (w-1, 0), (0,h-1) and (w-1, h-1). Since your transformation is affine, why not transform these coordinates into destination coordinates?

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

Your destination image size is then:

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

Upvotes: 1

Related Questions