Spaces:
Sleeping
Sleeping
#importing packages | |
from pdf2image import convert_from_path | |
from fpdf import FPDF | |
import cv2 | |
import numpy as np | |
import requests | |
from PIL import Image | |
from PIL import ImageEnhance | |
def boxcutter(img): | |
img = np.array(img) | |
height, width = img.shape[:2] | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to grayscale | |
blurred = cv2.GaussianBlur(gray, (5, 5), 0) | |
(T, threshInv) = cv2.threshold(blurred, 230, 255, cv2.THRESH_BINARY_INV) | |
contours, hierarchy = cv2.findContours(threshInv,cv2.RETR_LIST, \ | |
cv2.CHAIN_APPROX_SIMPLE) | |
mx = (0,0,0,0) # biggest bounding box so far | |
mx_area =0 | |
my_dict = {} | |
for cont in contours: | |
x,y,w,h = cv2.boundingRect(cont) | |
area = w*h | |
nw = x,y,w,h | |
my_dict[nw] = area | |
if len(my_dict)<=2: | |
return img | |
else: | |
x,y,w,h = sorted(my_dict, key=my_dict.get)[-2] | |
roi=img[y:y+h,x:x+w] | |
height_r, width_r = roi.shape[:2] | |
if height_r > int(height*0.6) and width_r > int(width*0.6): | |
return roi | |
# cv2.imwrite('C:/Users/Meet/Desktop/crop/'+ img_path.split('/')[-1], roi) | |
# cv2.rectangle(img,(x,y),(x+w,y+h),(200,0,0),2) | |
# cv2.imwrite('C:/Users/Meet/Desktop/cont/' + img_path.split('/')[-1], img) | |
else: | |
return img | |
# cv2.imwrite('C:/Users/Meet/Desktop/crop/'+ img_path.split('/')[-1], img) | |
# cv2.rectangle(img,(x,y),(x+w,y+h),(200,0,0),2) | |
# cv2.imwrite('C:/Users/Meet/Desktop/cont/' + img_path.split('/')[-1], img) | |
def noise_removal(image): | |
#increasing contrast of text | |
image=Image.fromarray(image) | |
enhancer=ImageEnhance.Contrast(image) | |
enhanced_image=enhancer.enhance(2.5) | |
image=np.array(enhanced_image) | |
#noise removel using dilate,erode, morphology and median blur | |
kernel = np.ones((1, 1), np.uint8) | |
image=cv2.dilate(image,kernel,iterations=1) | |
kernel=np.ones((1,1),np.uint8) | |
image=cv2.erode(image,kernel,iterations=1) | |
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel,iterations=1) | |
image=cv2.medianBlur(image,3) | |
image=cv2.bitwise_not(image) | |
kernel=np.ones((1,1),np.uint8) | |
image=cv2.erode(image,kernel,iterations=3) | |
image=cv2.bitwise_not(image) | |
image=cv2.bitwise_not(image) | |
kernel=np.ones((1,1),np.uint8) | |
image=cv2.dilate(image,kernel,iterations=3) | |
image=cv2.bitwise_not(image) | |
return (image) | |
def preprocessing_function(url): | |
#reading and converting the pdf into image format | |
response = requests.get(url) | |
with open('metadata.pdf', 'wb') as f: | |
f.write(response.content) | |
images = convert_from_path('metadata.pdf', 200) | |
#removing red color from the answer paper | |
for i in range(len(images)): | |
img = boxcutter(images[i]) | |
image = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) | |
img_hsv=cv2.cvtColor(image, cv2.COLOR_BGR2HSV) | |
lower_red = np.array([161,50,50]) | |
upper_red = np.array([189,255,255]) | |
mask1 = cv2.inRange(img_hsv, lower_red, upper_red) | |
image[np.where(mask1==255)] = 255 | |
#using noise removal function to remove noise and enhance the images | |
img_bw = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) | |
no_noise = noise_removal(img_bw) | |
cv2.imwrite("no_noise"+str(i)+".jpg", no_noise) | |
#saving the the final preprocessed images as pdf | |
pdf = FPDF() | |
for j in range(len(images)): | |
pdf.add_page() | |
pdf.image("no_noise"+str(j)+".jpg", 0, 0, 200, 300) | |
pdf.output("answer_paper.pdf", "F") |