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

Discussion in 'WASM.A&O' started by Arthur, Jul 2, 2009.

  1. Arthur

    Arthur New Member

    Blog Posts:
    0
    Доброе время суток!

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

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

    Booster New Member

    Blog Posts:
    0
    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

    Blog Posts:
    0
    Так а что это за тип "Texture", что означает поле size?
     
  4. punxer

    punxer Андрей

    Blog Posts:
    0
    Копай в сторону матричных фильтров. Там всё просто, для каждого эффекта есть своя матрица. Можно играться с её значениями и тем самым создавать определённые свои эффекты.
     
  5. Pavia

    Pavia Well-Known Member

    Blog Posts:
    0
    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

    Blog Posts:
    0
    Pavia
    Спасибо за разъяснения, что к чему.

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