Trimming the white space in an image using PIL in python
Question:
I am doing handwritten digit recognition using SciKit-learn so for that I need to crop the clicked picture so I have prepared a template on the Word.
Now what I want is the image to be cropped along the border so that I can crop it further to extract the digits.
Sample Image is given below:
For cropping the image I am using this Code.
Below is the parent Image from which the above rectangle has been cropped:
Note: The parent image has a border too(which is not visible in the image) so trimming the white space might help in getting a modified parent image so that predefined (height, width) would be almost same for various crops to be done on the image.
Answers:
You could apply this pipeline: convert to grayscale -> apply thresholding (convert to white & black) -> find contours -> choose the contours of the right shape.
Here is example code:
#!/usr/bin/env python
import cv2
BLACK_THRESHOLD = 200
THIN_THRESHOLD = 10
ANNOTATION_COLOUR = (222,0,222)
img = cv2.imread('template.png')
orig = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, thresh=BLACK_THRESHOLD, maxval=255, type=cv2.THRESH_BINARY_INV)[1]
# Optional: save thesholded image
cv2.imwrite("temp_thres.png", thresh)
# Find contours on the thresholded image
contours = cv2.findContours(thresh,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
for cont in contours:
# Find bounding rectangle of a contour
x,y,w,h = cv2.boundingRect(cont)
# Skip thin contours (vertical and horizontal lines)
if h<THIN_THRESHOLD or w<THIN_THRESHOLD:
continue
# Does the countour has the right shape (roughly four times longer than high)?
if 3*h<w<5*h:
roi = orig[y:y+h,x:x+w]
cv2.imwrite("four_letters.png",roi)
# Optional: draw annotations
cv2.rectangle(img,(x,y),(x+w,y+h),ANNOTATION_COLOUR,3)
# Optional: save annotated image
cv2.imwrite("temp_cont.png",img)
(You can delete the three optional steps. They are just for generating images temp_thres.png
and temp_cont.png
.)
Input image template.png
:
Thresholded image temp_thres.png
:
Found contours temp_cont.png
:
Four letter space four_letters.png
:
I am doing handwritten digit recognition using SciKit-learn so for that I need to crop the clicked picture so I have prepared a template on the Word.
Now what I want is the image to be cropped along the border so that I can crop it further to extract the digits.
Sample Image is given below:
For cropping the image I am using this Code.
Below is the parent Image from which the above rectangle has been cropped:
Note: The parent image has a border too(which is not visible in the image) so trimming the white space might help in getting a modified parent image so that predefined (height, width) would be almost same for various crops to be done on the image.
You could apply this pipeline: convert to grayscale -> apply thresholding (convert to white & black) -> find contours -> choose the contours of the right shape.
Here is example code:
#!/usr/bin/env python
import cv2
BLACK_THRESHOLD = 200
THIN_THRESHOLD = 10
ANNOTATION_COLOUR = (222,0,222)
img = cv2.imread('template.png')
orig = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, thresh=BLACK_THRESHOLD, maxval=255, type=cv2.THRESH_BINARY_INV)[1]
# Optional: save thesholded image
cv2.imwrite("temp_thres.png", thresh)
# Find contours on the thresholded image
contours = cv2.findContours(thresh,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
for cont in contours:
# Find bounding rectangle of a contour
x,y,w,h = cv2.boundingRect(cont)
# Skip thin contours (vertical and horizontal lines)
if h<THIN_THRESHOLD or w<THIN_THRESHOLD:
continue
# Does the countour has the right shape (roughly four times longer than high)?
if 3*h<w<5*h:
roi = orig[y:y+h,x:x+w]
cv2.imwrite("four_letters.png",roi)
# Optional: draw annotations
cv2.rectangle(img,(x,y),(x+w,y+h),ANNOTATION_COLOUR,3)
# Optional: save annotated image
cv2.imwrite("temp_cont.png",img)
(You can delete the three optional steps. They are just for generating images temp_thres.png
and temp_cont.png
.)
Input image template.png
:
Thresholded image temp_thres.png
:
Found contours temp_cont.png
:
Four letter space four_letters.png
: