Формирование замкнутой кривой из ребер

Я пытаюсь сделать анимацию серии Фурье в питоне, как это

https://www.youtube.com/watch?v=QVuU2YCwHjw&app=desktop

Итак, чтобы сделать это из изображения, мне нужен список точек, образующих замкнутую кривую. Я могу сделать это для простых изображений, подобных этому:

музыкальная нота

путем пороговой обработки изображения и поиска контура объект контура по умолчанию имеет точки, упорядоченные по пути кривой.

Однако как мне это сделать для таких сложных изображений, как этот homer

Я могу использовать хитрость, чтобы найти контуры (которые уже черные), но как мне преобразовать это в форму приблизительной замкнутой кривой.

Вот как я сделал для простого случая

ret,thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cts=contours[0].reshape(-1,2)
plt.plot(cts[:,0],cts[:,1])
plt.show()

Это создает хороший сюжет, подобный этому (инверсия не является проблемой) plot, но это не работает в сложных изображениях, поскольку существует несколько контуры

Итак, в основном TLDR: как мне соединить ребра, найденные Кэнни, чтобы сформировать единую замкнутую кривую (или любой другой способ сделать это)?

ПРИМЕЧАНИЕ. Я требую, чтобы точки располагались как на контуре, чтобы при выполнении

plt.plot(x,y)

Я получаю хороший контур изображения, а не линии, пересекающиеся повсюду.

Любая помощь приветствуется.


person Kousik Rajesh    schedule 02.07.2019    source источник
comment
Вам нужно вычислить выпуклую оболочку. Взгляните на это: stackoverflow.com/questions/50392449/ ... и это: docs.opencv.org/3.4/d7/d1d/tutorial_hull.html   -  person ma3oun    schedule 02.07.2019
comment
@ma3oun, но это просто образовало бы корпус вокруг внешней формы изображения, глаза и все остальное (из изображения выше) не будут частью кривой, верно?   -  person Kousik Rajesh    schedule 02.07.2019