Approximating a contour
A lot of contours that we encounter in real life are noisy. This means that the contours don't look smooth, and hence our analysis takes a hit. So, how do we deal with this? One way to go about this would be to get all the points on the contour and then approximate it with a smooth polygon.
Let's consider the boomerang image again. If you approximate the contours using various thresholds, you will see the contours changing their shapes. Let's start with a factor of 0.05:

If you reduce this factor, the contours will get smoother. Let's make it 0.01:

If you make it really small, say 0.00001, then it will look like the original image:

The following code represents how to convert those contours into approximate smoothing of polygons:
import sys import cv2 import numpy as np if __name__=='__main__': # Input image containing all the different shapes img1 = cv2.imread(sys.argv[1]) # Extract all the contours from the input image input_contours = get_all_contours...