OpenCV: Is there a way to use cv2.approxPolyDP to approximate open curve?

I would like to approximate smooth lines with chain of line segments.

cv2.approxPolyDP in OpenCV 3.4 made a good result in the case of closed curve:

Original image of closed curve:
Original image

Approximated result image of closed curve:
Original image

But in the case of open curve, cv2.approxPolyDP did not achieve the desired effect:
Original image of open curve:
Original image

Approximated result image of open curve:
Result image

The result I want should like this(this picture is created by Photoshop but not Python program):
Result image

Is there a way to use cv2.approxPolyDP to approximate open curve?

My Python program is as fllow.
import cv2

img = cv2.imread('1.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow("gray", gray)
cv2.waitKey(0)

_, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)

# cv2.imshow("binary", binary)
# cv2.waitKey(0)

_, contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    epsilon = 0.009 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, closed=True)
    cv2.drawContours(img, [approx], -1, (0, 255, 255), 1)

cv2.imshow("approx", img)
cv2.waitKey(0)

cv2.destroyAllWindows()
Photos I used in program are as fllow.

1.jpg

2.jpg

Tag: none

Leave a new comment