Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.02.2010, 10:03
гость

 
Сообщений: n/a

Сглаживание поверхностей
Прошу помощи! Какие существуют математические методы сглаживания поверхностей?
  #2  
Старый 26.02.2010, 23:50
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Первым и важнейшим методом сглаживания поверхностей является метод глажения утюгом.
  #3  
Старый 17.03.2011, 08:34
shustov87

 
Сообщений: n/a

Спрошу ещё тут... Может кто-то подкинет идейку. задачу постараюсь описать конкретнее)

Необходимо сгладить полученные экспериментальные данные, которые представляют собой двумерный массив – поэтому сглаживание нужно двумерное. Простое поочерёдное сглаживание вначале горизонтально, а затем – вертикально - даёт неудовлетворительный результат. Далее по этим данным будет браться первая и вторая производные. Поэтому хочется сгладить кубическим сплайном – т.к. «Кубический сплайн гарантирует непрерывность первой и второй производных функции».
Сформировал массив значений для аппроксимации, приведённой процедурой. Это стандартный csv-файл(его понимает Excel). (Для аппроксимации всегда будет массив размерностью [0..N,0..M]. Каждое значение отделено - ; а каждая новая линия начинается с новой строки).

for (int i = 0; i < MyRestoreData.Grid.ProectionX_Count; i++)
{
string stLine = "";
for (int j = 0; j < MyRestoreData.Grid.ProectionY_Count; j++)
{
string val = MyRestoreData.SmoothAreaExtremums[i, j].ToString();
stLine += val;
if (j != MyRestoreData.Grid.GridWidthCount - 1)
stLine += ";";
}
MyFile.WriteLine(stLine);
}
Для наглядности также сформировал по этим данным изображение. На двумерном изображении каждая полоса говорит об изменении величины на единицу и построил 3D. Хотя эти построения мне не нужны – привожу их лишь для наглядности и понимания вида данных.
Математическая литература мне даётся очень тяжело, поэтому надеюсь на какие-то конкретные подсказки. Литературы по этому поводу переискал кучу по поводу сплайн сглаживания поверхностью попадались лишь научные статьи. Да и убил времени на это не мало – пытаясь как-то сгладить поочерёдным проходом по горизонтали и вертикали, играясь с весовыми коэффициентами... для математический операций использую alglib и ILNumerics.Net.

кажется как-то используют тензорное произведение, но я честно говоря не понял что там и как. Есть смысл пытаться разобраться? если кто знает объясните пожалуйста на пальцах.
Фото:
http://s58.radikal.ru/i161/1103/20/1e2c85819998.jpg
http://i065.radikal.ru/1103/11/7418f6db145c.jpg

Ссылка на тему на исходниках. то тут не получилось файл залить
http://forum.sources.ru/index.php?showtopic=328168

Спасибо.
  #4  
Старый 17.03.2011, 17:21
Местный

Отправить личное сообщение для prografix Посмотреть профиль Найти все сообщения от prografix
 
Регистрация: 03.11.2006
Адрес: Москва
Сообщений: 167

Сплайны используют для интерполяции, а не для "сглаживания". Тебе нужна аппроксимация.
  #5  
Старый 18.03.2011, 12:34
Пользователь

Отправить личное сообщение для mserg Посмотреть профиль Найти все сообщения от mserg
 
Регистрация: 29.10.2006
Сообщений: 57

Насколько я понимаю, здесь не требуется ни аппроксимация, ни интерполяция.

Классика жанра такова. Сглаженная функция должна, с одной стороны, быть близкой исходным данным; с другой стороны гладкой.
Близость функции f(i,j) экспериментальным данным g(i,j) можно сделать квадратичной:
L1(i,j)=(f(i,j)-g(i,j))^2
Гладкость результирующей функции можно оценивать так (квадраты вторых производных)
L2(i,j)=(f(i-1,j)-2*f(i,j)+ f(i+1,j))^2 + (f(i,j-1)-2*f(i,j)+ f(i,j+1))^2
или что-нибудь такое:
L2(i,j)=(f(i-1,j)+f(i+1,j) + f(i,j-1) + f(i,j+1) -4*f(i,j))^2

Общий критерий будет таков (есть небольшой геморрой на границах)
L = sum(<i,j>, L1(i,j)+k*L2(i,j))
Здесь k – определяет силу компромисса между гладкостью и соответствию исходным данным..

Нужно подобрать такой массив f(i,j), чтобы минимизировать критерий L. Очевидно, что здесь f(i,j) – та самая сглаженная функция (изображение)

Прямое решение этой задачи – квадратичное программирование. Однако можно разработать итерационную схему для минимизации L, т.е. получения f(i,j). Как это сделать – возможно подскажет кто-нибудь из участников форума. Припоминаю, что на эту тему есть книжка «Зрение роботов».

Реализация, скорее всего, займет несколько строк кода.

Последний раз редактировалось mserg, 18.03.2011 в 12:46.
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра