-
Notifications
You must be signed in to change notification settings - Fork 1
/
imageProcessingUsingNumPy.py
51 lines (37 loc) · 1.69 KB
/
imageProcessingUsingNumPy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from PIL import Image
import numpy as np
import math
fileName = "Images/rotate.png"
image = np.array(Image.open(fileName))
angle=int(input("Angle: "))
angle=math.radians(angle)
cosine=math.cos(angle)
sine=math.sin(angle)
height=image.shape[0]
width=image.shape[1]
# Define the height and width of the rotated bound
rotatedHeight = abs(round(abs(image.shape[0]*cosine)+abs(image.shape[1]*sine)))
rotatedWidth = abs(round(abs(image.shape[1]*cosine)-abs(image.shape[0]*sine)))
result = np.zeros((rotatedHeight,rotatedWidth,image.shape[2]))
# Centroid of the original
originalCentroidY = round(((image.shape[0])/2))
originalCentroidX = round(((image.shape[1])/2))
# Centroid of the resultant image
rotatedCentroidY= round(((rotatedHeight)/2))
rotatedCentroidX= round(((rotatedWidth)/2))
for i in range(height):
for j in range(width):
#co-ordinates of the pixels with respect to the centroid of original image
y=image.shape[0]-i-originalCentroidY
x=image.shape[1]-j-originalCentroidX
#Transformation
rotatedY=round(-x*sine+y*cosine)
rotatedX=round(x*cosine+y*sine)
#Change of origin
rotatedY=rotatedCentroidY-rotatedY
rotatedX=rotatedCentroidX-rotatedX
#Condition to prevent absurd values
if 0 <= rotatedX < rotatedWidth and 0 <= rotatedY < rotatedHeight and rotatedX>=0 and rotatedY>=0:
result[rotatedY,rotatedX,:]=image[i,j,:]
rotatedImg=Image.fromarray((result).astype(np.uint8))
rotatedImg.show()