-
Notifications
You must be signed in to change notification settings - Fork 0
/
rotation.py
98 lines (77 loc) · 2.66 KB
/
rotation.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
"""
Automatically detect rotation and line spacing of an image of text using
Radon transform
If image is rotated by the inverse of the output, the lines will be
horizontal (though they may be upside-down depending on the original image)
It doesn't work with black borders
"""
from __future__ import division, print_function
from skimage.transform import radon, rotate
from numpy import asarray, mean, array
import numpy
import matplotlib.pyplot as plt
from matplotlib.mlab import rms_flat
from im_treatement import resizing
from get_chars import plt_i
try:
# More accurate peak finding from
# https://gist.github.com/endolith/255291#file-parabolic-py
from parabolic import parabolic
def argmax(x):
return parabolic(x, numpy.argmax(x))[0]
except ImportError:
from numpy import argmax
filename = 'img/skew.png'
def get_rotation(im,params):
"""
Funcio que descobreix la rotacio de la imatge amb la transformada de redo
* Inputs:
- im = skimage.io image
- params = diccionari de parametres
*Outputs:
- rotation = angle de rotacio
"""
I = asarray(im)
I = I - mean(I) # Demean; make the brightness extend above and below zero
# Do the radon transform and display the result
sinogram = radon(I)
# Find the RMS value of each row and find "busiest" rotation,
# where the transform is lined up perfectly with the alternating dark
# text and white lines
r = array([rms_flat(line) for line in sinogram.transpose()])
rotation = argmax(r)
if(params["TEST_MODE"]["rotation"]):
plt.figure()
plt.subplot(1, 3, 1)
plt.imshow(I)
plt.subplot(1, 3, 2)
plt.imshow(sinogram.T, aspect='auto')
plt.gray()
plt.axhline(rotation, color='r')
return rotation
def fix_rotation(im, params):
"""
Rota la imatge perque les linies estiguin horitzontalment
* Inputs:
- im = skimage.io image
- params = diccionari de paràmetres
*Outputs:
- im = imatge amb el text amb orientacio horitzontal
"""
if(params["status_msg"]): print("Rotation Module Activated: Get Skew Angle")
x, y = im.shape
sz = 400
if(x>sz):
im_small = resizing(im, sz)
else:
im_small = im
rotation = get_rotation(im_small, params)
if(params["status_msg"]): print("Rotating: ", 90-rotation)
imr = rotate(im, 90-rotation, preserve_range=True, cval=numpy.max(im))
if(params["TEST_MODE"]["rotation"]):
plt.subplot(1, 3, 3)
plt.imshow(imr)
if(params["status_msg"]): print("Rotation OK")
return imr