Фильтр Blur

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Фильтр Blur

Сообщение BV » 13.03.2006 (Пн) 21:53

Пример для решения вопроса по сглаживанию изображения. Полная автономность, никаких дополнительных библиотек.
Вложения
Blur.rar
(16.91 Кб) Скачиваний: 237
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 16.03.2006 (Чт) 18:37

Что-то больно тормознуто, скорость сильно падает при увеличении радиуса размытия, в то время, как есть алгоритмы, свободные от этого недостатка.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.03.2006 (Чт) 21:23

Mikle писал(а):в то время, как есть алгоритмы, свободные от этого недостатка.


Можно пример?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.03.2006 (Сб) 10:55

BV
К вечеру постараюсь написать пример.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.03.2006 (Сб) 14:08

Вот мой вариант, при увеличении радиуса с 1 до максимального быстродействие падает лишь вдвое, да и на маленьких радиусах работает побыстрее. Ограничение - радиус должен быть меньше половины меньшего размера картинки. Загрузка из файла и вывод на экран - только для примера.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 18.03.2006 (Сб) 15:15

Код интересный - натолкнул на мысль, как ускорить мой фильтр :)

Но кроме ограничения в радиусе у него есть ещё один, куда более серьёзный недостаток - качество. Он делает не пятно, а скорее "затирку". Проект бегло просмотрел, так что причину пока не скажу.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.03.2006 (Сб) 18:32

серьёзный недостаток - качество.

Это билинейная фильтрация, качество соответственное. Попробуй применять фильтр дважды подряд, скорость все равно будет высокой, а внешне результат изменится.
Но главное было - показать смысл задумки, что значение фильтра можно не вычислять для каждой точки заново, а лишь вносить поправку, используя уже вычисленное значение предыдущей точки.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 18.03.2006 (Сб) 23:23

Сделал оптимизацию - скорость увеличилась в несколько раз.
Вложения
Blur.rar
Оптимизированная версия
(17.45 Кб) Скачиваний: 276
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Кирпичный завод

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList