|
Дискретное преобразование Фурье | ☑ | ||
---|---|---|---|---|
0
batmansoft
09.02.16
✎
17:44
|
Добрый день. На C# реализовал алгоритм дискретного преобразования Фурье и обратно, согласно формулам вот этим:
https://yadi.sk/i/YRo7h5XRoZLKp. Начал тестировать и почему то при обратно преобразовании результат даже близко не валяется с тем, что было на входе первого преобразования. По формулам вроде бы все правильно в алгоритме сделал. Использовал стандартные C#-аповские Compex. подскажите, пожалуйста, что тут может быть неправильно, что то мозги уже совсем плавятся от этих комплексных чисел. вот код: /// <summary> /// Преобразование Фурье /// </summary> public class FurieTrans { /// <summary> /// Коэффициенты /// </summary> public List<Complex> koeffs; /// <summary> /// Количество точек, которые закодированы в данном ДПФ /// </summary> public double K; public FurieTrans() { koeffs = new List<Complex>(); } /// <summary> /// Выполнить дискретное преобразование Фурье /// </summary> /// <param name="points">Точки контура</param> /// <param name="count">Количество коэффициентов</param> public void dpf(List<Point> points, int count) { koeffs.Clear(); K = points.Count; //Цикл вычисления коэффициентов for(int u=0; u<count; u++) { //цикл суммы Complex summa = new Complex(); for (int k = 0; k < K; k++) { Complex S = new Complex(points[k].X, points[k].Y); double koeff = -2 * Math.PI * u * k / K; Complex e = new Complex(Math.Cos(koeff), Math.Sin(koeff)); summa += (S * e); } koeffs.Add(summa/K); } } /// <summary> /// Обратное преобразование Фурье /// </summary> /// <returns>Точки</returns> public List<Complex> undpf() { List<Complex> res = new List<Complex>(); for(int k=0; k<K-1; k++) { Complex summa = new Complex(); for (int u = 0; u < koeffs.Count; u++ ) { double koeff = 2 * Math.PI * u * k / K; Complex e = new Complex(Math.Cos(koeff), Math.Sin(koeff)); summa+=(koeffs[u]*e); } res.Add(summa); } return res; } } |
|||
1
Garykom
гуру
09.02.16
✎
17:58
|
(0) А может не умничать и сказать нафуя?
|
|||
2
Garykom
гуру
09.02.16
✎
17:59
|
||||
3
batmansoft
09.02.16
✎
18:08
|
(1) Магистерскую диссертацию пишу на тему "Компьютерное зрение". Проблема: как получить инвариантный дескриптор контура. Решил посмотреть в сторону преобразования Фурье. (2) Кажется, разорался, оказывается, количество коэффициентов должно равняться количеству точек, а не так как в классическом преобразовании, где чем больше коэффициентов, тем точнее. Но за ссылку все равно спасибо.
|
|||
4
Рэйв
09.02.16
✎
18:16
|
подумаешь Фурье...Вот теорему Ферма бы реализовал - это было бы и почет и нобелевская премия:-)
|
|||
5
Рэйв
09.02.16
✎
18:17
|
а то аоследнии изыски которые засчитали - не внушают доверия
|
|||
6
Garykom
гуру
09.02.16
✎
18:18
|
(3) >получить инвариантный дескриптор контура
для этой цели обычно векторизацию юзают, а не гармоники хотя если взять некую точку в центре контура и далее как в полярных координатах пройтись по окружности...гм |
|||
7
batmansoft
09.02.16
✎
18:18
|
(4) А реализацию искусственного интеллекта (или хотя бы его части, напр., компьютерное зрение) - это разве не достойная задача?
|
|||
8
batmansoft
09.02.16
✎
18:21
|
(6) Дык в планах есть и векторизацию рассмотреть. Но с гармониками вот что удобно: можно сравнивать и приближенные контуры. Например, если хороший четкий контур, который надо сравнить с кривым и расплывчатым, который получиться в ходе анализа какого-то изображения, и сказать, насколько они похожи. Вот как сравнивать?
|
|||
9
Garykom
гуру
09.02.16
✎
18:30
|
а может все таки не свой лисапед с 0, а взять OpenCV ?
https://habrahabr.ru/post/208090/ https://habrahabr.ru/post/172651/ |
|||
10
rsv
09.02.16
✎
19:54
|
(0) Это где то из области радиолокации ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |