Реализация Smooth-алгоритма?

Тема в разделе "WASM.A&O", создана пользователем Arthur, 2 июл 2009.

  1. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Доброе время суток!

    Нужна функция вида:
    void smooth(DWORD * prgba, unsigned width, unsigned height, unsigned percent);

    Т. е. функции передается массив цветов точек формата (RGBA-32 bit, на каждый канал ровно 8-бит), ширина и высота картинки и процент сглаживания, ну и задача функции нанести эффект сглаживания. Я искал, но все примеры на Delphi, с использованием всяких там компонентов. Я в pascal'е-видных языках не силен, поэтому до конца понять алгоритм так и не удалось.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F
     
  3. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Так а что это за тип "Texture", что означает поле size?
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Копай в сторону матричных фильтров. Там всё просто, для каждого эффекта есть своя матрица. Можно играться с её значениями и тем самым создавать определённые свои эффекты.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Arthur
    Размытие делается так.
    Обычно в качестве ядра фильтера используют Гаусовское размытие.
    Рассмотрим одномерный случий один канал.
    Реализации различаются. Можно разделить на КИХ фильтеры и БИХ.
    КИХ представляет из себя следующее.

    x[j] входной массив значений
    Мы берем в некоторой позиции j соседнии элементы домножаем их на весовые коэфициенты и складываем и клодем ввыходной массив. И сдвигаем позицию j.

    for (i=-n; i<=n; i++)
    y[j]+=x[j+i]*f[i+n];

    Если в свертке x[j+i] выходит за приделы массива то берем равною 0 это возникает только на границах.
    Еще как вариант брать семметричное отраженное.

    Эта операция называется сверткой. Также называют боксовым фильтером или матричным называется так так как фильтр f представляет сабой массив, а в 2D матрицу.

    Массив f заполняется по формуля Гауса.
    n - Это радиус размытия
    s- sigma стандартное отклонение.
    Обычно радиус задают через сигму
    n=int((3*s+1)/2); // Правило 3 сигм.
    n=floor(s * 3*sqrt(2*pi)/4 + 0.5); // Более точная взаимо связь

    for (i=-n; i<=n; i++)
    f[i+n]=1/(sqrt(2*Pi*s*s))*exp(-i*i/(2*s*s)); // Гаусовская формула.

    В программах обычно указывается сигма по которой будет вестись размытие.

    Теперь что касается 2D случия. Конечно можно завести 2D матрицу, но гораздо быстрее выполнить вначале размытие по строчкам затем по столбцам. Вместо N^2 умножений мы имеем 2*N.

    И такое размытие можно сделать для всех каналов.
     
  6. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Pavia
    Спасибо за разъяснения, что к чему.

    Остальным спасибо за наводку.