Проверяли ли вы результат cv2.adaptiveThreshold ()?
Результат cv2.adaptiveThreshold () выглядит следующим образом:

Я думаю, что это не то, что вы хотите.
Попробуйте использовать глобальный порог cv2.threshold () и отрегулируйте пороговое значение.
ret, thresh = cv2.threshold(image, 240, 255, cv2.THRESH_BINARY)

Кроме того, вы можете добавить cv2.morphologyEx () для удаления шума.
kernel = np.ones((2,2),np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)