Pull to refresh

Comments 58

Можно пару вопросов, а то у меня в голове не уложилось до конца:

1. В случае использования преобразования Хоара, если отбрасывается вся высокочастотная составляющая, то чем это приобразование лучше обычного подобия blur фильтра, или просто говоря, сжатия, которое уменьшает разрешение по X в 2 раза? Или я пропустил, и часть высокочастотной составляющей остает?

2. Ну и хотелось бы немного больше акцента, на то, чем оно принципиально отличается от преобразования Фурье, и как частного случая — cosine transform? Ведь cosine transform это тоже по сути, разлжение картинки на различные частотные составляющие, с последующим откидыванием наиболее высоких частот, и квантованием тех, которые оставлены. При этом «частот» используется куда больше — матрица 8x8. Расскажите, чем описанные вами алгоритмы лучше, пожалуйста. (Сам я не сильно глубоко знаком с этой темой).
Говоря про cosine transform — я забыл сказать, что имею в виду, как оно используется в JPEG, а не вообще.
1. Если отбросить все высокие частоты — то ничем. Будет просто размытие. Поэтому отбрасывают не всё, а, например, только значения, которые меньше по модулю некоторого порога. А те, что остаются, округляют до пары значащих цифр.

2. Кстати, преобразование Хаара — это почти то же самое, что и FFT по двум точкам. Там тоже полусумма и полуразность.

В самом деле, это очень близкие вещи в дискретном случае. DCT — это тоже, в общем-то, фильтр, но имеющий несколько полос. Если делаем DCT по 8 точкам, то получаем отфильтрованные значения из 8 диапазонов.

У DWT два диапазона — высокие частоты и низкие. Высокочастотный диапазон снова можно поделить на высокие и низкие. И ещё тут есть особенность — мы сами так конструируем фильтры, чтобы энергия сигнала концентрировалась в высокочастотной области, то есть чтобы было проще потом квантовать. Но из-за этого функции, которые используются при разложении, выглядят весьма «несинусоидально».

Вообще, сложно рассказать об отличиях кратко. Тут целую статью можно написать. :)
Ясно, спасибо за развернутый ответ, вроде более-менее уловил суть :)
UFO just landed and posted this here
Ваш второй вопрос хороший, но почему-то в ответ на него начинают бормотать что-то про частотные диапазоны (что в принципе верно, но совершенно никак не следует из изложенного в заметке научно-популярного материала).

Простой ответ состоит в том, что при использовании преобразования Фурье (в одной из форм) приходится фиксировать размер окна и в результате учитываются зависимости между яркостями пикселов только на одном фиксированном масштабе. При использовании же вейвлет размер окна сам собой оказывается переменным — в тех местах, где яркость меняется медленно, используется широкое окно, а там, где быстро — узкое.

В принципе слова про различия в строении полосового фильтра — о том же, но требуют некоторого чутья в области Фурье анализа, при отсутствии которого получаются утверждения про «костыли» преобразования Фурье. А на самом деле Фурье-анализ с переменным окном обладает большинством свойств вейвлет (а те, которыми он не обладает, в этой заметке и не обсуждались) и известно как вейвлета Морле (которая, впрочем, не является вейвлетой в смысле дискретного вейвлетного преобразования).
Согласен.

Из материала заметки ответ на вопрос о различиях вообще никак не выудить, на самом деле. Потому я и ответил на комментарий кратко.

Что дискретное преобразование Фурье, что дискретное вейвлет-преобразование — оба они являются линейными преобразованиями. Я в статье просто показал, как можно построить линейное преобразование, обладающее интересующими свойствами, и сказал, что результат называется вейвлет-преобразованием. На самом деле этого уже достаточно для элементарного применения на практике. Для более-менее предметного разговора о различиях нужно вводить понятие компактного носителя, рассматривать свёртки и т. д.

Цель же статьи, как Вы абсолютно верно заметили, была научно-популярная. Я хотел показать, что вейвлеты не возникли на пустом месте, а могут быть представлены как обобщение решения весьма конкретной практической задачи. Правда, каюсь, до конца я объяснения не довёл, побоявшись что обилие математики отпугнёт читателей.

Такой вот дисклеймер. :)
Да все нормально. Ваш стиль мне напомнил популярные (более-менее) статьи Гильберта Стренга (Gilbert Strang), он тоже любит начинать с линейной алгебры. А мое объяснение про окно переменной ширины все-таки ближе к выбранному Вами уровню изложения (ИМХО).
Очень прикольно, но мало =) больше математики.
Промазал. Ответ ниже.
О! Когда начал было много планов. И проиллюстрировать написанное, и рассказать про биортогональные вейвлеты, и примеры кода привести. Но уж очень много всего получается. Рассказать несложно, а оформить…

Надеюсь, напишу ещё статью, но уже ориентированную на программирование.
И ещё одну на математику :)
Есть какие-нибудь готовые утилиты, чтобы попробовать как оно жмет?
UFO just landed and posted this here
На хабре была статья, описывающая алгоритм сжатия на основе вейвлетов. Там и текст программы приводится. Правда, использовались не вейвлеты Добеши, а биортогональные вейвлеты и лифтинг-схема, про которые я не рассказывал.

Из алгоритмов сжатия изображений вейвлеты используют, к примеру, DjVu (точнее, IW44) и JPEG2000. В видеокодеке Dirac тоже вейвлеты внутри. Но там всё сложнее устроено, конечно.

А утилит, которые используют вейвлеты Добеши в чистом виде я не припомню. Но если на неделе будет свободное время, напишу как изложенный материал использовать на практике.
Помню на конференции по компьютерной графике в МГУ в 1998 году вейвлетам предрекалось большое будущее в разных областях. Сейчас же говорится о сжатии изображений и в качестве примера приводится не самый популярный формат, у которого кажется еще и проблемы с лицензиями. Можно упомянуть формат DjVu, который так же использует вейвлеты, но в целом за 14 лет какого-то видимого скачка не произошло. А может применяется не так явно?

Кстати вейвлет сжатие изображений оказалось панацеей для хранения рентгеновских и МРТ снимков. Объемы то в хороших клиниках «там» накапливаются приличные.

А вообще большое спасибо — тему надо продолжать, только через популяризацию можно привлечь на сторону добра :)
Ну, вейвлеты в самом деле широко используются при анализе и обработке сигналов. В аудиоредакторах есть вейвлет-спектрограммы, в графических редакторах — вейвлет-фильтры, в графических и видеокодеках применяются. Хотя, конечно, это не решение всех проблем.

Но так всегда. Придумают что, потом начинается ажиотаж, а через некоторое время всё стихает. Вспомните хотя бы нейронные сети!
Ну, скажем, к нейронным сетям ажиотаж интерес сначала схлынул, когда стало понятно, что сходу конфетки не выйдет. А сейчас интерес к ним снова появился.
Забавно, в хорошем смысле, читать этот комментарий из 2021 года :)
К слову, нашел эту статью, разбираясь как вейвлеты используют для сжатия архитектур нейронных сеток.

Для меня это вдвойне забавно, так как я сам давно уже занимаюсь глубоким обучением и как раз пару недель назад тоже пробовал применять вейвлеты в генеративной модели по аналогии со SWAGAN. :)

У меня в бложике, кстати, есть эта же статья, но немного подправленная, а ещё продолжение про лифтинг. Может, позже код выложу с примерами к ним.

Спасибо, здорово! Люблю статьи где объяется от самых примитивов. Хотя мне кажется, можно было бы ещё немного углубиться.
— неплохая книжка также у Чуи «Введение в вейвлеты».
— другим примером применения является способность передавать графику с заданной степенью точности (пример с Леной уж слишком хрестоматиен)
— интересно также приложение вейвлет-анализа к функциональным разложениям.
— Демьянович — лучший.
ваш никнейм и любовь к алгоритмам так и просит спросить Ruptor вы или нет?
жаль, но не знаю, о ком идет речь
ну надо же :)… и все же, что такое Ruptor?
Мне книжка Чуи как раз показалась худшей из доступых. Общая теория там описана очень отрывочно и однобоко, а сплайн-вейвлетам, которым в основном посвящены работы автора, отведено слишком много места. В качестве вводного учебника книжка Блаттера выглядит привлекательнее.
Тестировали новые компьютеры. Фурье- и вейвлет преобразования идут на ура. Квейк тоже не тормозит.
Вейвлеты не вытеснили другие алгоритмы сжатия графических изображений, но заняли разные ниши, о которых писали в комментариях. Добавлю в копилку свою историю.

Году в 99-ом я с помощью вейвлетов запаковывал данные с высотами земной поверхности, представленными в виде двумерного массива DEM. Огромные и по нынешним временам объемы приходилось ужимать в 30-60 раз, чтобы они поместились на CD-диск или, в виде участков достаточной площади, в GPS приемник. При этом нужно было обеспечить приемлемую точность — все-таки данные предназначены для навигации. Платформа накладывала серьезные ограничения на применение арифметики с плавающей точкой, поэтому рассматривался особый класс вейвлет-преобразований с целыми коэффициентами — в отличие от рассмотренных в статье. В общем, без вейвлетов было бы трудно обойтись.

Любопытно, что в некоторых случаях проблема быстродействия остается актуальной и сегодня. Например, в марсианских миссиях NASA, столь активно обсуждаемых на Хабре, используется ICER — аналог JPEG 2000, построенный тоже на вейвлетах, но реализующийся на целочисленной арифметике.
Вейвлеты хорошо жмут картинку. Есть очень быстрые преобразования например 5/3 вейвлеты, используют только целые числа сложения и сдвиги. Они могут использоваться для сжатия без потерь, что и применяется в медицине. Так же очень хорошо происходит декорреляция изображения в bayer формате без всяких цветовых преобразований. Вот приме реального когда одномерного преобразования,
<code>
/**	\brief One step 1D 5/3 discrete wavelet transform.
        \param in	The input data array.
        \param out 	The output data array.
	\param w 	The length.
*/
static inline void dwt_53_1d(int16 *in, int16 *out, const uint32 w)
{
	int wt = w - 2, i, j;
	int16 *l, *h;
	l = out; h = &out[(w>>1) + (w&1)];
	h[0] = in[1] - ((in[0] + in[2])>>1);
	l[0] = in[0] + (h[0]>>1);
	for(i=2,j=1; i < wt; i+=2,j++){
		h[j] = in[i+1] - ((in[i] + in[i+2])>>1);
		l[j] = in[i] + ((h[j-1] + h[j])>>2);
	}
	if(w&1){
		l[j] = in[i] + (h[j-1]>>1);
	} else{
		h[j] = in[i+1] - in[i];
		l[j] = in[i] + ((h[j-1] + h[j])>>2);
	}
}
</code>

двумерное это просто комбинация одномерно по горизонтали и вертикали. Теперь ложка дегтя, вейвлеты совершенно не пригодны для сжатия межкадровых разностей изображений, т.е видеопоследовательностей, по этому и не получили широкого распространения.
Теперь ложка дегтя, вейвлеты совершенно не пригодны для сжатия межкадровых разностей изображений, т.е видеопоследовательностей, по этому и не получили широкого распространения.

Но при сжатии видео их всё же удаётся использовать. Например, они применяются в кодеках Dirac и Tarkin.
Не разбирался с Dirac и Tarkin, скорей всего они жмут вейвлетом только I фрейм, потому как бессмысленно жать ими P или B фреймы. Нет ни однго промышленного вайвлет видео кодера. Dirac тоже уже загнулся, BBC поигралось и вовремя остановилось.
Насчет промышленных вейвлет-кодеков — это ИМХО как с realtime-рейтрейсингом: вроде и теоретическая база проработана, и алгоритмическая, и картинка получается — залюбуешься! Но вот вычислительные ресурсы (массово доступные) — увы, пока массово недоступны. Но лет так через 5, когда наконец-то наступит технологическая сингулярность
Есть интересная и довольно оптимстичная статья по видеокодированию вейвлетами (Wavelet-based video compression: A glimpse of the future?) Здесь описаны основные проблемы вейвлетов и как с ними можно боротья.
Основная прблема 3D сжатие сжатия видео — это найти трактории движения каждой точки во времени и по
этим траекторияю уже провети вейвлет преобразование. Но если вы сможите найти эти трактории, то вам не нужны будт вейвлеты, вы и так великолепно сожмете видео. В дальнейшем в сжатие видео можно продвинутся только векторизацией изображения и ослеживанием изменений всех векторов или объектов. Опять же, каждый нормальный кодек должен и меть «железную» реализацию. Самое принципиальное отличие DWT от DCT — это то что DWT работает со всем изображением, а не с квадратиками 8x8 или 4x4. И чтобы сделать 2d вайвлет преобразование нужно хранить все изображение в памаяти, что занчительнео усложнчет хардверную реализацию, я уже не говорю о 3d преобразованиях.
Ну почему же не пригодны? Очень даже пригодны. Принцип Wavelet-кодеков для видео, типа Dirac, насколько я знаю, грубо говоря, в «расширении» идеи Wavelet-сжатия 2D-изображения в третье измерение — т.е. время. Т.е. получается «декорреляция в трех измерениях». В случае видео это дает очень и очень эффективное кодирование «межкадровой разности». Но требования к вычислительным ресурсам при этом, естественно, существенно возрастают.
Её [матрицу изображения] можно записать построчно в файл и сжать каким-то архиватором.

Используемые архиваторы обычно работают с одномерным массивом (сигналом), игнорируя двумерную природу данных. В степени сжатия можно ещё немного выиграть, выбирая особый порядок записи байтов перед архивацией. Например, записывать не строки, а блоки изображения по очереди. Под блоком подразумевается изображение, что получаемое на одном шаге преобразования — они хорошо различимы на картинке с замком из статьи. Блоки, представляющие разности соседних элементов по горизонтали (первый такой блок на картинке справа сверху) можно записывать по столбцам, чтобы прообразы соседних элементов были ближе на исходном изображении. Это легко понять, рассмотрев вертикальную стену башни. А правый нижний блок — записывать змейкой по диагонали.

При этом если записывать вначале низкочастотные блоки (в левом верхнем углу на картинке), то можно получить возможность прогрессивной, т. е. работающей по мере поступления данных, распаковки.
Да, Вы правы. На вход энтропийного кодера подают именно одномерный поток данных. Хотя там есть и свои особенности, конечно. Про запись по строчкам я намеренно написал упрощённо, а то пришлось бы лезть в дебри. Впрочем, Вы продемонстрировали, что можно и кратко всё изложить.

Описанный Вами способ применим, если изображение вообще делится на блоки. Так поступают в том же JPEG для ускорения расчётов. В случае с вейвлетами можно подвергнуть преобразованию хоть всё изображение сразу.

Ещё можно заметить, что самая важная информация содержится в старших битах коэффициентов и единицы концентрируются именно в них, поэтому можно переупорядочить биты, передавая сначала старшие, а потом младшие. Этот подход используется в алгоритме SPIHT.
UFO just landed and posted this here
Да, эту тему активно начали развивать ещё в конце восьмидесятых. И тогда же предложили использовать для сжатия графики, если не ошибаюсь.

С тормознутостью тоже боролись как могли. Приблизительно в конце 90-х был разработан формат PGF, в котором был сделан упор на производительность.
а я по дурости тогда в это поверил и курсовую по сжатию делал в 2000м.
UFO just landed and posted this here
без особых. хуже джипегов
Это преобразование получило название вейвлета D4 (читателю предлагается самостоятельно разгадать тайну этого буквенно-цифрового названия).
Ну, прежде всего приходит на ум, что буква D происходит от фамилии Добеши, а цифра 4 — от того, что вейвлет имеет дело с четвёрками.

Если ещё немного подумать, то отыскивается более глубокая игра слов: фамилия Добеши оканчивается на «ши», что созвучно произношению японского иероглифа «四», означающего четвёрку. (На другом таком же созвучии с четвёркою основано популярное восточное суеверие, известное как тетрафобия.)
Сейчас — по традиции, дабы иллюстрировать работу алгоритмов на всегда одном и том же изображении.
А изначально — из-за технических ограничений сканера, которым пользовались исследователи.
en.wikipedia.org/wiki/Lenna
Вопрос был риторический. Но спасибо за ответ :-)
Изначально использование Лены было неким эпатажем, поскольку многие понимали, из чего вырезана картинка. А потом наиболее смелые авторы стали использовать аналогичным образом вырезанные участки из гораздо более откровенных фотографий, благо сейчас не проблема найти оригинал. Но пруфлинк не приведу, потерял среди кучи статей.
По «официальной» версии — не было эпатажем. Что нашлось в комнате у исследователей, то и отсканировали. Подобно ютскому чайнику — исследователь во время чаепития обдумывал тело для иллюстрации своих алгоритмов, да так и оцифровал заварочный чайник со своего стола.

Лена — не первый и далеко не единственный пример использования эротических фотографий для иллюстрации научных и околонаучных статей: каждому автору хочется, чтобы его статья «задевала глубинные струны в душах читателей», даже на Хабре регулярно попадаются иллюстрации с соблазнительными девушками, даже во вчерашней статье Abbyy. Все же понимают, чем цепануть глаз суровых айтишников :)

См.тж: Keeping Abreast of Pornographic Research in Computer Science
Ok, может и не было эпатажем, но воспринималось однозначно как эпатаж. Еще задолго до появления сервисов поиска картинок и юбилейной выставки фотографий Лены люди, занимающиеся обработкой изображений, нашли полный вариант картинки и с хитрой усмешкой показывали его непосвященным :)
Мне кажется, вы переворачиваете картину с ног на голову.

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

И поэтому намного вероятнее, что открыв статью, они с восторгом узнавали знакомую по «Плейбою» Лену — чем наоборот: открыв «Плейбой», узнавали Лену, знакомую по научным статьям.
Аудитория «Плейбоя» была многочисленнее, но пересечение этих аудиторий было ничтожным, даже в сравнении с и так малочисленной аудиторией статей по обработке изображений.
Ой ну конечно же, исследователи на переднем крае новой технологии были сплошь седовласые старцы и чопорные отцы семейств.
Не знаю как Вам, а мне живые девушки всегда казались более приятными, чем бумажные, так что по сути я только эту картинку из Плейбоя и видел (ну и еще может пару раз обложки в сети)
«Все дивчины в город посмотались, не хотят колхозной жизнью жить»? Вот ведь никогда заранее не предсказать, где встретишь марсианина представителя иной цивилизации :))
Автор занулил на Лене все вейвлет-разности, вот тебе и потеря информации при сжатии
Большое спасибо за статью! Мне как раз на следующей неделе студентам объяснять вейвлеты, хотя, как оказалось, я бы и сам был не против, чтобы мне их вот так объяснили.
Sign up to leave a comment.

Articles