Вейвлет-преобразование

9

Я хочу выполнить 2D дискретное вейвлет-преобразование Хаара и обратное DWT на изображении. Объясните, пожалуйста, двумерный хаар дискретный вейвлет-преобразование и обратный DWT простым языком и алгоритм, с помощью которого я могу написать код для 2D хаар DWT«Информация, представленная в Google, была слишком технической. Я понял основные вещи, такие как разделение изображения на 4 поддиапазона: LL, LH, HL, HH, но я не могу понять, как написать программу для выполнения DWT и IDWT на изображение. Я также прочитал, что DWT лучше, чем DCT, поскольку он выполняется на изображении в целом, а затем было какое-то объяснение, которое переросло мою голову. Я могу ошибаться, но я думаю, что методы сжатия DWT и DCT потому что размер изображения уменьшается при выполнении DWT или DCT на них. Надеюсь, что вы, ребята, делитесь частью ваших знаний и расширяете мои знания.

Благодарю вас

Re: Имеет ли это какое-либо отношение к формату изображения. Что такое «значение пикселя», которое используется в DWT? Я предположил, что это значение RGB изображения.

import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.io.*;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.imageio.ImageIO;
import java.awt.*;
import java.lang.*;
import java.util.*;

class DiscreteWaveletTransform

{

    public static void main(String arg[])
    { DiscreteWaveletTransform dwt=new DiscreteWaveletTransform();
      dwt.initial();
    }


    static final int TYPE=BufferedImage.TYPE_INT_RGB;
    public void initial()
    {
    try{

        BufferedImage buf=ImageIO.read(new File("lena.bmp"));
        int w=buf.getWidth();
        int h=buf.getHeight();
        BufferedImage dwtimage=new BufferedImage(h,w,TYPE);
        int[][] pixel=new int[h][w];
        for (int x=0;x<h;x++)
        {
            for(int y=0;y<w;y++)
            {
                pixel[x][y]=buf.getRGB(x,y);


            }
        }
        int[][] mat =  new int[h][w];
        int[][] mat2 =  new int[h][w];

        for(int a=0;a<h;a++)
        {
            for(int b=0,c=0;b<w;b+=2,c++)
            {
                mat[a][c]    = (pixel[a][b]+pixel[a][b+1])/2;
                mat[a][c+(w/2)]  = Math.abs(pixel[a][b]-pixel[a][b+1]);
            }
        }
        for(int p=0;p<w;p++)
        {
            for(int q=0,r =0 ;q<h;q+=2)
            {
                mat2[r][p]   = (mat[q][p]+mat[q+1][p])/2;
                mat2[r+(h/2)][p] = Math.abs(mat[q][p]-mat[q+1][p]);
            }
        }
        for (int x=0;x<h;x++)
        {
            for(int y=0;y<w;y++)
            {
                dwtimage.setRGB(x,y,mat2[x][y]);
            }
        }
        String format="bmp";
        ImageIO.write(dwtimage,format, new File("DWTIMAGE.bmp"));
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

Вывод - это черное изображение с тонкой линией между ними, короче говоря, рядом с фактическим выводом. Я думаю, что я неправильно истолковал логику. Пожалуйста, укажите на ошибки. С уважением

user1320483
источник
Приведенный выше код очень много значит для меня, спасибо .. не могли бы вы предоставить мне Java-код для инверсии 2D-преобразования

Ответы:

15

Объясните, пожалуйста, двумерное хаар-дискретное вейвлет-преобразование 2D и обратное DWT простым языком.

Полезно думать о вейвлет-преобразовании в терминах дискретного преобразования Фурье (по ряду причин см. Ниже). В преобразовании Фурье вы разбиваете сигнал на ряд ортогональных тригонометрических функций (cos и sin). Важно, чтобы они были ортогональными, чтобы можно было разложить ваши сигналы на ряд коэффициентов (двух функций, которые по существу НЕ зависят друг от друга) и снова скомпоновать их.

Имея в виду этот критерий ортогональности , возможно ли найти две другие функции, которые ортогональны помимо cos и sin?

Да, можно придумать такие функции с дополнительной полезной характеристикой, что они не распространяются на бесконечность (как это делают cos и грех). Одним из примеров такой пары функций является вейвлет Хаара .

Теперь, с точки зрения DSP, возможно, более практично думать об этих двух «ортогональных функциях» как двух фильтрах с конечной импульсной характеристикой (FIR) и дискретном вейвлет-преобразовании как серии сверток (или, другими словами, применяя эти фильтры последовательно в течение некоторого временного ряда). Вы можете убедиться в этом, сравнив и сравнив формулы 1-D DWT и формулы свертки .

На самом деле, если вы обратите внимание на функции Хаара, вы увидите два самых элементарных фильтра низких и высоких частот. Вот очень простой фильтр нижних частот h = [0.5,0.5] (не беспокойтесь о масштабировании на данный момент), также известный как фильтр скользящего среднего, потому что он, по сути, возвращает среднее значение для каждых двух соседних выборок. Вот очень простой фильтр верхних частот h = [1, -1], также известный как дифференциатор, потому что он возвращает разницу между любыми двумя соседними выборками.

Чтобы выполнить DWT-IDWT на изображении, это просто случай использования двумерных версий свертки (чтобы последовательно применять фильтры Хаара).

Возможно, теперь вы можете начать видеть, откуда берутся части изображения LowLow, LowHigh, HighLow, HighHigh изображения, подвергшегося DWT. ОДНАКО, пожалуйста, обратите внимание, что изображение уже ДВУМЕРНО (возможно, это иногда сбивает с толку). Другими словами, вы должны получить низко-высокие пространственные частоты для оси X и те же диапазоны для оси Y (вот почему на каждую ось приходится два минимума и два максимума)

и алгоритм, с помощью которого я могу написать код для 2D хаар DWT?

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

Я могу ошибаться, но я думаю, что методы сжатия DWT и DCT, потому что размер изображения уменьшается при выполнении DWT или DCT на них

Здесь действительно «стоит» думать о DWT с точки зрения преобразования Фурье. По следующей причине:

В преобразовании Фурье (и, конечно, также в DCT) вы преобразовываете МНОГИЕ ОБРАЗЦЫ (во временной области) в ОДИН (комплексный) коэффициент (в частотной области). Это потому, что вы строите различные синусоиды и косинусоиды, а затем умножаете их на свой сигнал и получаете среднее значение этого продукта. Итак, вы знаете, что один коэффициент Ak представляет собой масштабированную версию синусоиды некоторой частоты (k) в вашем сигнале.

Теперь, если вы посмотрите на некоторые из вейвлет-функций, вы заметите, что они немного сложнее, чем простые синусоиды. Например, рассмотрим преобразование Фурье высокочастотного фильтра Хаара ... Высокочастотный фильтр Хаара выглядит как прямоугольная волна, т. Е. Имеет острые края (резкие переходы) ... Что нужно для создания SHARP EDGES? .. ... много, много разных синусоид и косинусоидов (!)

Следовательно, представление вашего сигнала / изображения с помощью вейвлетов экономит вам больше места, чем представление его синусоидами DCT, потому что ОДИН набор коэффициентов вейвлета представляет БОЛЬШЕ КОЭФФИЦИЕНТОВ DCT. (Немного более сложная, но связанная с этим тема, которая может помочь вам понять, почему это работает таким образом, - согласованная фильтрация ).

Две хорошие онлайн-ссылки (на мой взгляд, по крайней мере :-)): http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm и; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf

Лично я нашел очень полезными следующие книги: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (By Mallat) и; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Гилберт Странг)

Обе эти книги - абсолютно блестящие.

надеюсь, это поможет

(извините, я только что заметил, что этот ответ может быть слишком длинным: - /)

a_a
источник
Я в восторге от того, что вы ответили. Спасибо за ответ A_A. Основываясь на математической интерпретации DWT, которую я нашел в документе IEEE, я написал код. Как только я получу черное изображение, пожалуйста, помогите мне.
user1320483
Написание кода для выполнения DWT действительно много значит для меня. (Пожалуйста) ^ ∞. Я буду очень благодарен. Я разместил код выше.
user1320483
В вашем коде есть две вещи, которые следует отметить: а) Пожалуйста, просмотрите двумерную версию свертки (в данном случае она не становится проще, чем в этом случае) и б) Обратите внимание, что ваше «изображение» представляет собой набор коэффициентов, которые могут быть очень маленьким или очень большим и в любом случае выходить за пределы общего динамического диапазона в 255 цветов. Поэтому вам нужно найти диапазон ваших коэффициентов и масштабировать его до интервала 0,255. Вы идете только на один уровень разложения?
A_A
а) Пожалуйста, просмотрите двумерную версию свертки (в данном случае она не упрощается), я не уверен, что вы подразумеваете под этим. «изображение» - это набор коэффициентов, которые могут быть очень маленькими или очень большими и в любом случае выходить за пределы общего динамического диапазона из 255 цветов. Это означает, что после добавления мне нужно проверить, превышает ли значение 255 и начинается ли оно с 0? Вы идете только на один уровень разложения? Да Большое спасибо
user1320483
Под (а) я подразумеваю, что если вы хотите применить фильтры Хаара (согласно ответу, приведенному выше), вам придется рассмотреть, как это делается с помощью операции свертки, и в случае фильтров Хаара это очень просто. Да, вам нужно нормализовать ваши коэффициенты в диапазоне 0-255, чтобы можно было их «увидеть». Что касается RGB, пожалуйста, обратите внимание на изображения в градациях серого (только одно значение). Вы должны сначала понять, что вам нужно сделать, а затем сделать это. Поиск «кода» в конечном итоге займет больше времени.
A_A
8

Я начал писать это до ответа от @A_A , но этот ответ отличный. Тем не менее, я надеюсь, что следующее может немного добавить к вашему пониманию.

xHx~

x=Hx~
HH

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

Следует отметить, что, в частности, с ортонормированными преобразованиями, ваш сигнал по-прежнему является вашим сигналом, независимо от того, в каком базисе он находится. Не следует думать, что один базис как-то является правильным доменом (я использую домен для обозначения базиса в общем смысле) ,

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

В общем, временная (или пиксельная) область может рассматриваться как имеющая отличное временное (или пространственное) разрешение и плохое разрешение по частоте. И наоборот, область Фурье можно рассматривать как имеющую отличное разрешение по частоте и плохое временное (или пространственное) разрешение.

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

Разные вейвлеты имеют разные свойства. В дополнение к ссылкам от @A_A, я также рекомендую этот учебник IEEE по DTCWT. Основное внимание в руководстве уделяется не вейвлет-преобразованию как таковому , а потому, что я рекомендую его, потому что оно дает фантастическое понимание проблем, связанных с DWT, и того, как их можно облегчить (я бы сказал, что это требует базового понимания сначала хотя). Это действительно связывает понимание вейвлетов с пониманием преобразования Фурье и того, почему последний обладает хорошими свойствами, которые он имеет.

Если вам нужен еще какой-нибудь справочный код по преобразованию Хаара, у моего бывшего руководителя есть несколько примеров matlab на его веб-странице (zip-файл в разделе «4F8 Image Coding Course», HAAR2D.M и IHAAR2D.M). Это очень много обучающих примеров.

Генри Гомерсалл
источник