Перетворення вейвлетів


9

Я хочу виконати дискретне вейвлет-трансформацію 2D-хаар і зворотну DWT на зображенні. Поясніть, будь ласка, простою мовою дискретного перетворення вейвлетів та зворотним DWT простою мовою та алгоритмом, за допомогою якого я можу написати код для 2D haar dwtІнформація, надана в Google, була надто технічною. Я розумів основні речі, такі як поділ зображення на 4 піддіапазони: LL, LH, HL, HH, але я не можу зрозуміти, як написати програму для виконання DWT та IDWT на image.I також читав, що 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();
        }
    }
}

Вихід - це чорне зображення з тонкою лінією посеред, коротше, де немає фактичного виводу. Я думаю, що я неправильно інтерпретував логіку. Зверніть увагу на помилки. З повагою



Вищеописаний код для мене дуже багато дякує ... чи можете ви надати мені код java для зворотного двовимірного перетворення

Відповіді:


15

Поясніть, будь ласка, простою мовою дискретне вейвлет-перетворення 2D та зворотний DWT простою мовою

Корисно подумати про вейвлет-перетворення з точки зору дискретної трансформації Фур'є (з ряду причин див. Нижче). У перетворенні Фур'є ви розкладаєте сигнал на ряд ортогональних тригонометричних функцій (cos і sin). Для них важливо, щоб вони були ортогональними, щоб можна було розкласти ваші сигнали на ряд коефіцієнтів (двох функцій, які по суті є НЕЗАЛЕЖНІ одне від одного) і повторно скласти їх назад.

Маючи на увазі цей критерій ортогональності , чи можна знайти дві інші функції, ортогональні крім cos і гріха?

Так, можна придумати такі функції з додатковою корисною характеристикою, що вони не поширюються на нескінченність (як це роблять cos і гріх). Одним із прикладів такої пари функцій є вейвлет Хаар .

Тепер, з точки зору DSP, можливо, більш практично думати про ці дві "ортогональні функції" як два фільтри Кінцевого імпульсного реагування (FIR) та Дискретне перетворення вейвлетів як серію згортків (або іншими словами, застосовуючи ці фільтри послідовно за деякий часовий ряд). Ви можете перевірити це, порівнюючи та протиставляючи формули 1-D DWT та форми згортки .

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

Для виконання DWT-IDWT на зображенні, це просто випадок використання двовимірних версій згортки (застосовувати фільтри Haar послідовно).

Можливо, зараз ви можете почати бачити, звідки беруться частини зображення LowLow, LowHigh, HighLow, HighHigh зображення, яке зазнало DWT. ЗАРАЗ, будь ласка, зауважте, що зображення вже ДВОЙ РОЗМІРНИЙ (можливо, це кілька разів заплутане). Іншими словами, ви повинні отримати низько-високі просторові частоти для осі X та однакові діапазони для осі Y (саме тому є два мінімуми та два максимуми на осі)

і алгоритм, за допомогою якого я можу написати код для 2D haar dwt?

Ви дійсно повинні спробувати кодувати це самостійно з перших принципів, щоб ви зрозуміли весь процес. Дуже легко знайти готовий фрагмент коду, який буде робити те, що ви шукаєте, але я не впевнений, що це дійсно допоможе вам у довгостроковій перспективі.

Я можу помилитися тут, але я думаю, що методи стиснення DWT та DCT, оскільки розмір зображення зменшується, коли на них виконується DWT або DCT.

Ось де насправді "платить" думати про DWT з точки зору перетворення Фур'є. З наступної причини:

У перетворенні Фур'є (і, звичайно, також DCT) ви перетворюєте МНОГО ЗРАБОК (у часовій області) в коефіцієнт ONE (комплексний) (в частотній області). Це тому, що ви конструюєте різні синусоїди та косинусоїди, а потім помножуєте їх на свій сигнал і отримуєте середній показник цього продукту. Отже, ви знаєте, що один коефіцієнт Ak являє собою масштабовану версію синусоїди деякої частоти (k) у вашому сигналі.

Тепер, якщо ви подивитеся на деякі функції вейвлет, ви помітите, що вони трохи складніші, ніж прості синусоїди. Наприклад, розглянемо перетворення Фур'є у фільтрі Хаара з високим проходом ... Високочастотний фільтр Хаара схожий на квадратну хвилю, тобто має гострі краї (різкі переходи) ... Що потрібно, щоб створити ШАРП-ЕДГИ? .. ... Багато, багато різних синусоїдів та ко-синусоїдів (!)

Отже, представлення сигналу / зображення за допомогою вейвлетів економить вам більше місця, ніж представлення його синусоїдами DCT, оскільки ОДНІЙ набір коефіцієнтів вейвлет представляє БІЛЬШЕ DCT COEFFICIENTS. (Трохи більш вдосконалена, але пов’язана з цим тема, яка може допомогти вам зрозуміти, чому це працює таким чином, - це відповідна фільтрація ).

Два хороших посилання в Інтернеті (на мій погляд, принаймні :-)): http://facturing.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 (За Маллатом) та; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Автор Gilbert Strang)

Обидві це абсолютно геніальні книги з цього приводу.

Я сподіваюся, що це допомагає

(вибачте, я щойно помітив, що ця відповідь може працювати занадто довго: - /)


Я в захваті від того, що ти відповів. Дякую за відповідь A_A. На основі математичної інтерпретації DWT, яку я знайшов у документі IEEE, я написав код.
користувач1320483

Написання коду для виконання DWT насправді дуже багато для мене означає (будь ласка) ^ ∞. Я буду дуже вдячний. Я розмістив код вище.
користувач1320483

У вашому коді слід зазначити дві речі: a) Перегляньте двовимірну версію згортки (вона не стає простішою, ніж у цьому випадку) і b) Будь ласка, зауважте, що ваше "зображення" - це набір коефіцієнтів, які можуть бути дуже маленьким або дуже великим і в будь-якому випадку поза загальним динамічним діапазоном 255 кольорів. Тому вам потрібно знайти діапазон ваших коефіцієнтів і масштабувати його до інтервалу 0,255. Ви збираєтесь лише на один рівень розкладання?
A_A

a) Перегляньте двовимірну версію згортки (вона не стає простішою, ніж у цьому випадку). Я не впевнений, що ви маєте на увазі під цим. "зображення" - це набір коефіцієнтів, який може бути дуже малим або дуже великим і, в будь-якому випадку, поза загальним динамічним діапазоном 255 кольорів. Це означає, що після додавання я повинен перевірити, чи перевищує значення 255 і чи починається він з 0? Ви збираєтесь лише на один рівень розкладання? Так, велике спасибі
користувач1320483

Що я маю на увазі під (а), це те, що якщо ви хочете застосувати фільтри Хаар (відповідно до відповіді, наведеної вище), вам доведеться переглянути, як це робиться за допомогою згортки, а у випадку фільтрів Хаар це дуже простий. Так, вам потрібно нормалізувати свої коефіцієнти до діапазону 0-255, щоб мати можливість їх "бачити". Що стосується RGB, то слід зосередитись на зображеннях градацій сірого (лише одне значення). Спершу вам потрібно зрозуміти, що це потрібно робити, а потім зробити це. Шукати "коду" у довгостроковій перспективі буде забирати більше часу.
A_A

8

Я почав писати це ще до відповіді від @A_A , але ця відповідь відмінна. Все ж сподіваюся, що наступне може трохи доповнити ваше розуміння.

Дискусія про вейвлети і так далі потрапляє в загальну дискусію про базовий розклад сигналів. Під цим ми маємо на увазі, що ми можемо представити наш сигнал як добуток якоїсь базової матриці та вектора, що представляє наш сигнал в альтернативній основі (розкладання основи), . Тобто: Базова матриця як правило, є ортонормальною матрицею (наприклад, дискретна матриця Фур'є, вейвлет-матриця Хара), але потрібно не бути - є цілі сфери досліджень, що розглядають розкладаються сигнали на надмірно закінчені словники, що означаєxHx~

x=Hx~
HH ширший, ніж високий (наприклад, через мінімальні алгоритми норми L1).

Ідея базового декомпозиції сигналу полягає в тому, що сигнал може бути представлений в кращому вигляді на альтернативній основі. Що краще , ми маємо на увазі, що сигнал якимось чином піддається обробці чи розумінню, або будь-що інше - це насправді не має значення.

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

Тепер різні основи мають різні властивості. Я впевнений, що ви добре знаєте теорему згортання, що описує корисну залежність між доменом Фур'є та часовою областю. Це робить домен Фур'є корисним для виконання операцій зведення часової області.

Взагалі часовий (або піксельний) домен можна вважати відмінним часовим (або просторовим) дозволом та поганим дозволом частоти. І навпаки, домен Фур'є можна вважати відмінним дозволом частоти та поганим (або просторовим) дозволом.

Основи вейвлетів поміщаються десь посередині вищезгаданих двох. Вони, як правило, мають гарне частотне дозвіл і хороший час або просторове дозвіл. Однією властивістю вейвлет-перетворення є хороша розшарування природних зображень. Під цим я маю на увазі, що енергія з зображення стискається на кілька великих коефіцієнтів і безліч малих коефіцієнтів. Це означає, що більша частина яскравої інформації сигналу представлена ​​порівняно невеликим набором значень. У цьому суть стиснення.

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

Якщо ви хочете отримати ще якийсь довідковий код щодо перетворення Хаара, мій колишній керівник має кілька прикладів matlab на своїй веб-сторінці (zip-файл у розділі "Курс кодування зображень 4F8", HAAR2D.M та IHAAR2D.M). Це дуже багато прикладів навчання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.