import cv2
import imutils
import argparse
import numpy as np 
from skimage.filters import threshold_local
from pyimagesearch.transform import four_point_transform



ap = argparse.ArgumentParser()
ap.add_argument("-i","--image", required = True , help = "Path to the image to b scan")
args = vars(ap.parse_args())

#edge detection

image = cv2.imread(args["image"])
ratio = image.shape[0] / 500
orig = image.copy()
image = imutils.resize(image, height=500)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray , (5,5),0)
#to remove high frequency noise which helps in contour detection
edged = cv2.Canny(gray,75,200)


print("Edge Detection")
cv2.imshow("Image",image)
cv2.imshow("Edged", edged)
cv2.waitKey(0)
cv2.destroyAllWindow()




#finding the largest contor in the edged img
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key= cv2.contourArea, reverse = True)[:5]


for c in cnts:
	peri = cv2.arcLength(c,True)
	approx = cv2.approxPloyDP(c, 0.02 *peri , True)

	if len(approx) == 4:
		screenCnt = approx
		break


print("Find the contours")
cv2.drawContours(image, [screenCnt], -1, (0,255,0),2)
cv2.imshow("Outline", image)
cv2.waitKey(0)
cv2.destroyAllWindow()		


#apply a perspective transform and threshold

warped = four_point_transform(orig, screenCnt.reshape(4,2) *ratio)

warped =  cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
T = threshold_local(warped , 11 , offset = 10 , method = "gaussian")
warped = (warped > T).asType("uint8") * 255


cv2.imshow("original", imutils.resize(orig, height=650))
cv2.imshow("Scanned", imutils.resize(warped , height=650))
cv2.waitKey(0)

