I want to detect an angle (i.e, A) on the left hand side of figure (a) and rotate it in a correct one (i.e. figure b). This image is an answer sheet paper.
How can I do this in Python?
The imutils. rotate() function is used to rotate an image by an angle in Python.
You could use OpenCV with HoughLines
to detect lines in the image. The angle of each of the lines can be found from this:
import numpy as np import cv2 import math from scipy import ndimage img_before = cv2.imread('rotate_me.png') cv2.imshow("Before", img_before) key = cv2.waitKey(0) img_gray = cv2.cvtColor(img_before, cv2.COLOR_BGR2GRAY) img_edges = cv2.Canny(img_gray, 100, 100, apertureSize=3) lines = cv2.HoughLinesP(img_edges, 1, math.pi / 180.0, 100, minLineLength=100, maxLineGap=5) angles = [] for [[x1, y1, x2, y2]] in lines: cv2.line(img_before, (x1, y1), (x2, y2), (255, 0, 0), 3) angle = math.degrees(math.atan2(y2 - y1, x2 - x1)) angles.append(angle) cv2.imshow("Detected lines", img_before) key = cv2.waitKey(0) median_angle = np.median(angles) img_rotated = ndimage.rotate(img_before, median_angle) print(f"Angle is {median_angle:.04f}") cv2.imwrite('rotated.jpg', img_rotated)
This would give you an output as:
It shows the lines that were detected to rotate. The angle calculated is:
Angle is 3.9793
statistics.median()
could also be used instead of the numpy version if you are using Python 3.4 or later.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With