import cv2 import numpy as np def image_for_detection(raw_image): #remove tiny noises by blurring sm_image = cv2.GaussianBlur(raw_image,(5,5),0) #binarize ret, bw_image = cv2.threshold(sm_image,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) #dilate kernel = np.ones((2,2),np.uint8) bw_image = cv2.dilate(bw_image,kernel) return bw_image def image_for_extraction(raw_image): raw_image = cv2.GaussianBlur(raw_image,(3,3),0) ret,no_sm_bw_image = cv2.threshold(raw_image,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) return no_sm_bw_image def getTransformationMatrix(img): #input should be a binarized image - text white, bg black #Find all white pixels pts = np.empty([0,0]) pts = cv2.findNonZero(img) #Get rotated rect of white pixels rect = cv2.minAreaRect(pts) # rect[0] has the center of rectangle, rect[1] has width and height, rect[2] has the angle # To draw the rotated box and save the png image, uncomment below drawrect = img.copy() drawrect = cv2.cvtColor(drawrect, cv2.COLOR_GRAY2BGR) box = cv2.boxPoints(rect) box = np.int0(box) # box now has four vertices of rotated rectangle cv2.drawContours(drawrect,[box],0,(0,0,255),10) cv2.imwrite('rotated_rect.png', drawrect) #Change rotation angle if the tilt is in another direction rect = list(rect) if (rect[1][0] < rect[1][1]): # rect.size.width > rect.size.height temp = list(rect[1]) temp[0], temp[1] = temp[1], temp[0] rect[1] = tuple(temp) rect[2] = rect[2] + 90.0 #convert rect back to numpy/tuple rect = np.asarray(rect) #Rotate the image according to the found angle rotated_image = np.empty([0,0]) M = cv2.getRotationMatrix2D(rect[0], rect[2], 1.0) #img = cv2.warpAffine(img, M, (img.shape[1],img.shape[0])) #returns the transformation matrix for this rotation return M def rotate(image, M): return cv2.warpAffine(image, M, (image.shape[1],image.shape[0]))