Created
January 25, 2017 15:42
-
-
Save ashutosh2411/f62b514d6854236536afb72041199245 to your computer and use it in GitHub Desktop.
Skin Detector
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<module type="PYTHON_MODULE" version="4"> | |
<component name="NewModuleRootManager"> | |
<content url="file://$MODULE_DIR$" /> | |
<orderEntry type="inheritedJdk" /> | |
<orderEntry type="sourceFolder" forTests="false" /> | |
</component> | |
<component name="TestRunnerService"> | |
<option name="PROJECT_TEST_RUNNER" value="Unittests" /> | |
</component> | |
</module> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<project version="4"> | |
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.12 virtualenv at ~/.virtualenvs/cv" project-jdk-type="Python SDK" /> | |
</project> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<project version="4"> | |
<component name="ProjectModuleManager"> | |
<modules> | |
<module fileurl="file://$PROJECT_DIR$/.idea/document_scanner.iml" filepath="$PROJECT_DIR$/.idea/document_scanner.iml" /> | |
</modules> | |
</component> | |
</project> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Import the necessary packages | |
import numpy as np | |
import cv2 | |
def translate(image, x, y): | |
# Define the translation matrix and perform the translation | |
M = np.float32([[1, 0, x], [0, 1, y]]) | |
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) | |
# Return the translated image | |
return shifted | |
def rotate(image, angle, center = None, scale = 1.0): | |
# Grab the dimensions of the image | |
(h, w) = image.shape[:2] | |
# If the center is None, initialize it as the center of | |
# the image | |
if center is None: | |
center = (w / 2, h / 2) | |
# Perform the rotation | |
M = cv2.getRotationMatrix2D(center, angle, scale) | |
rotated = cv2.warpAffine(image, M, (w, h)) | |
# Return the rotated image | |
return rotated | |
def resize(image, width = None, height = None, inter = cv2.INTER_AREA): | |
# initialize the dimensions of the image to be resized and | |
# grab the image size | |
dim = None | |
(h, w) = image.shape[:2] | |
# if both the width and height are None, then return the | |
# original image | |
if width is None and height is None: | |
return image | |
# check to see if the width is None | |
if width is None: | |
# calculate the ratio of the height and construct the | |
# dimensions | |
r = height / float(h) | |
dim = (int(w * r), height) | |
# otherwise, the height is None | |
else: | |
# calculate the ratio of the width and construct the | |
# dimensions | |
r = width / float(w) | |
dim = (width, int(h * r)) | |
# resize the image | |
resized = cv2.resize(image, dim, interpolation = inter) | |
# return the resized image | |
return resized |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# import the necessary packages | |
import numpy as np | |
import cv2 | |
def order_points(pts): | |
# initialzie a list of coordinates that will be ordered | |
# such that the first entry in the list is the top-left, | |
# the second entry is the top-right, the third is the | |
# bottom-right, and the fourth is the bottom-left | |
rect = np.zeros((4, 2), dtype = "float32") | |
# the top-left point will have the smallest sum, whereas | |
# the bottom-right point will have the largest sum | |
s = pts.sum(axis = 1) | |
rect[0] = pts[np.argmin(s)] | |
rect[2] = pts[np.argmax(s)] | |
# now, compute the difference between the points, the | |
# top-right point will have the smallest difference, | |
# whereas the bottom-left will have the largest difference | |
diff = np.diff(pts, axis = 1) | |
rect[1] = pts[np.argmin(diff)] | |
rect[3] = pts[np.argmax(diff)] | |
# return the ordered coordinates | |
return rect | |
def four_point_transform(image, pts): | |
# obtain a consistent order of the points and unpack them | |
# individually | |
rect = order_points(pts) | |
(tl, tr, br, bl) = rect | |
# compute the width of the new image, which will be the | |
# maximum distance between bottom-right and bottom-left | |
# x-coordiates or the top-right and top-left x-coordinates | |
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2)) | |
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2)) | |
maxWidth = max(int(widthA), int(widthB)) | |
# compute the height of the new image, which will be the | |
# maximum distance between the top-right and bottom-right | |
# y-coordinates or the top-left and bottom-left y-coordinates | |
heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2)) | |
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2)) | |
maxHeight = max(int(heightA), int(heightB)) | |
# now that we have the dimensions of the new image, construct | |
# the set of destination points to obtain a "birds eye view", | |
# (i.e. top-down view) of the image, again specifying points | |
# in the top-left, top-right, bottom-right, and bottom-left | |
# order | |
dst = np.array([ | |
[0, 0], | |
[maxWidth - 1, 0], | |
[maxWidth - 1, maxHeight - 1], | |
[0, maxHeight - 1]], dtype = "float32") | |
# compute the perspective transform matrix and then apply it | |
M = cv2.getPerspectiveTransform(rect, dst) | |
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight)) | |
# return the warped image | |
return warped |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# python scan.py --image location_of_image/image_name_with_formaat | |
# import the necessary packages | |
from imutils.transform import four_point_transform | |
from imutils import imutils | |
from skimage.filters import threshold_adaptive | |
import argparse | |
import cv2 | |
# construct the argument parser and parse the arguments | |
ap = argparse.ArgumentParser() | |
ap.add_argument("-i", "--image", required = True, help = "Path to the image to be scanned") | |
args = vars(ap.parse_args()) | |
# load the image and compute the ratio of old height : new height | |
image = cv2.imread(args["image"]) | |
ratio = image.shape[0] / 300.0 | |
orig = image.copy() | |
image = imutils.resize(image, height = 300) | |
# convert the image to grayscale, blur it, and find edges in the image | |
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
gray = cv2.GaussianBlur(gray, (5, 5), 0) | |
edged = cv2.Canny(gray, 75, 200) | |
# show the original image and the edge detected image | |
print "STEP 1: Edge Detection" | |
cv2.imshow("Image", image) | |
cv2.imshow("Edged", edged) | |
cv2.waitKey(0) | |
cv2.destroyAllWindows() | |
# find the contours in the edged image, keeping only the largest ones, and initialize the screen contour | |
(_,cnts,hierarchy) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) | |
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5] | |
# loop over the contours | |
for c in cnts: | |
# approximate the contour | |
peri = cv2.arcLength(c, True) | |
approx = cv2.approxPolyDP(c, 0.02 * peri, True) | |
# if our approximated contour has four points, then we | |
# can assume that we have found our screen | |
if len(approx) == 4: | |
screenCnt = approx | |
break | |
# show the contour (outline) of the piece of paper | |
print "STEP 2: Find contours of paper" | |
cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2) | |
cv2.imshow("Outline", image) | |
cv2.waitKey(0) | |
cv2.destroyAllWindows() | |
# apply the four point transform to obtain a top-down | |
# view of the original image | |
warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio) | |
# convert the warped image to grayscale, then threshold it | |
# to give it that 'black and white' paper effect | |
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) | |
warped = threshold_adaptive(warped, 251, offset = 10) | |
warped = warped.astype("uint8") * 255 | |
# show the original and scanned images | |
print "STEP 3: Apply perspective transform" | |
cv2.imshow("Original", imutils.resize(orig, height = 650)) | |
cv2.imshow("Scanned", imutils.resize(warped, height = 650)) | |
cv2.waitKey(0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment