Whilst following a document scanner guide by Adrian Rosebrock I have encountered some issues with a python package python-skimage.
One of the modules associated with python-skimage. The script calls for the import of threshold_local which cannot be found.
On further investigation it seems that the version of python-skimage installed is an older version and does not contain threshold_local.
I have tried to install the latest version of python-skimage using:
However the problem exists.
Code: Select all
sudo apt-get install python-skimage
I have managed to work around this by modifying the two files containing threshold_local but this is a hack.
Can anyone hep me find out why I cannot update this package?
I am using Python2
When running the code below I received an import error:
Code: Select all
[email protected]:~/pyimagesearch $ python scan.py --image images/receipt.jpg Traceback (most recent call last): File "scan.py", line 6, in <module> from skimage.filters import threshold_local ImportError: cannot import name threshold_local
I only came across this issue whilst learning OpenCV following a tutorial. Whilst running the first script, which I have listed above, I encountered the error that threshold_local was not available. This led me to my research scikit-image.
Code: Select all
# USAGE # python scan.py --image images/page.jpg # import the necessary packages from transform import four_point_transform from skimage.filters import threshold_local import numpy as np import argparse import cv2 import imutils # 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 the old height # to the new height, clone it, and resize it image = cv2.imread(args["image"]) ratio = image.shape / 500.0 orig = image.copy() image = imutils.resize(image, height = 500) # 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 = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts if imutils.is_cv2() else cnts 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) T = threshold_local(warped, 11, offset = 10, method = "gaussian") warped = (warped > T).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)
The version of python-skimage installed appears to be 0.12.3-8. I have followed the installation guide in the documentation here:
I have run sudo apt-get install python-skimage on my Raspberry Pi but the version of python-skimage does not change?
Any help would be appreciated