Как создать сплайн-интерполяцию для несортированных значений x-python
Я пытаюсь создать плавные маски на лицах, чтобы обрисовать в общих чертах определенные особенности, используя dlib и OpenCV. В настоящее время у меня есть функция, чтобы найти правую область под глазами лица, как видно на этом изображении. Из этого изображения вы можете видеть, что у следов есть некоторые неровные края, которые я хотел бы сгладить.
На данный момент, чтобы попытаться сгладить края, я использую...
new_x = np.linspace(RIGHT_UNDEREYE[:, 0].min(),
RIGHT_UNDEREYE[:, 0].max(),
100)
new_y = spline(RIGHT_UNDEREYE[:, 0],
RIGHT_UNDEREYE[:, 1],
new_x)
... где RIGHT_UNDEREYE
являются соответствующими (x, y) значениями для трассы и приводят к этой интерполяции, что явно неверно. Я обнаружил, что проблема заключается в том, что я использую либо np.linspace
неправильно или просто не поддерживает массивы, где значение x не увеличивается от минимума до максимума.
Например, мои оригинальные x-данные для этого изображения, чтобы создать след...
[118 173 193 224 173 137]
и после использования linspace массив расширяется до...
[[118. 119.07070707 120.14141414 121.21212121 122.28282828
123.35353535 124.42424242 125.49494949 126.56565657 127.63636364
128.70707071 129.77777778 130.84848485 131.91919192 132.98989899
134.06060606 135.13131313 136.2020202 137.27272727 138.34343434
139.41414141 140.48484848 141.55555556 142.62626263 143.6969697
144.76767677 145.83838384 146.90909091 147.97979798 149.05050505
150.12121212 151.19191919 152.26262626 153.33333333 154.4040404
155.47474747 156.54545455 157.61616162 158.68686869 159.75757576
160.82828283 161.8989899 162.96969697 164.04040404 165.11111111
166.18181818 167.25252525 168.32323232 169.39393939 170.46464646
171.53535354 172.60606061 173.67676768 174.74747475 175.81818182
176.88888889 177.95959596 179.03030303 180.1010101 181.17171717
182.24242424 183.31313131 184.38383838 185.45454545 186.52525253
187.5959596 188.66666667 189.73737374 190.80808081 191.87878788
192.94949495 194.02020202 195.09090909 196.16161616 197.23232323
198.3030303 199.37373737 200.44444444 201.51515152 202.58585859
203.65656566 204.72727273 205.7979798 206.86868687 207.93939394
209.01010101 210.08080808 211.15151515 212.22222222 213.29292929
214.36363636 215.43434343 216.50505051 217.57575758 218.64646465
219.71717172 220.78787879 221.85858586 222.92929293 224. ]]
... где данные явно идут от моего минимума до максимума, где я их определил, но я не могу понять, как заставить значения x обернуться, чтобы интерполировать обратно к ... 173 137]
, В результате получается массив W-Winky, который, как RIGHT_UNDEREYE[:, 1]
выходит из...
[247 240 239 248 263 260]
... в new_y
массив...
[[247. 222.09990788 198.66904867 176.67789414 156.09691606
136.89658619 119.04737631 102.51975819 87.28420358 73.31118427
60.57117202 49.0346386 38.67205578 29.45389533 21.35062901
14.33272861 8.37066587 3.43491258 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0. ]]
Я искал другие функции или руководства о том, как создать интерполяцию, которую я ищу, но пока ничего не получалось. Я также попытался создать пользовательскую функцию в качестве обходного пути для моей проблемы, но ничего не получилось так хорошо. Есть ли какие-либо функции или какие-либо известные обходные пути, чтобы делать то, что я пытаюсь сделать?
Заранее спасибо.