Формирование замкнутой кривой из краев - PullRequest
2 голосов
/ 02 июля 2019

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

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

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

music note

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

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

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

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

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: Как мне соединить ребра, найденные Canny, чтобы сформировать одну замкнутую кривую (или любой другой метод для этого)?

ПРИМЕЧАНИЕ: я требую, чтобы точки были упорядочены, как в контуре, чтобы, когда я делаю

plt.plot(x,y)

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

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

...