Use a colorspace transformation to ease your thresholding operation:
img = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2HSV)[:, :, 2]
Now you can threshold using threshold=127
and get a much better result:
For this example there is barely anything more you can do. I quickly checked with a contouring algorithm and using Bézier curves to smooth the resulting contour, but this does not really improve the result further.