การแปลงเวฟเล็ต


9

ฉันต้องการที่จะทำการแปลงเวฟเล็ตแบบไม่ต่อเนื่อง Haar 2D และผกผัน DWT บนภาพ คุณช่วยอธิบายการแปลงเวฟเล็ตฮาร์ตแบบไม่ต่อเนื่อง 2D และ DWT แบบผกผันในภาษาง่าย ๆ และอัลกอริทึมที่ใช้ซึ่งฉันสามารถเขียนโค้ดสำหรับ 2D haar 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();
        }
    }
}

เอาท์พุทเป็นภาพสีดำที่มีเส้นบาง ๆ อยู่ระหว่างนั้นในระยะสั้นใกล้กับเอาต์พุตจริงฉันคิดว่าฉันตีความตรรกะผิด ๆ โปรดชี้ให้เห็นข้อผิดพลาด ความนับถือ



โค้ดด้านบนมีความหมายอย่างมากสำหรับฉันขอบคุณ .. คุณช่วยบอกรหัส java สำหรับผกผันของการแปลง

คำตอบ:


15

คุณช่วยอธิบายการแปลงเวฟเล็ต 2D แบบไม่ต่อเนื่องและผกผัน DWT เป็นภาษาง่าย ๆ ได้ไหม

มันเป็นประโยชน์ที่จะคิดว่าการแปลงเวฟเล็ตในแง่ของการแปลงฟูริเยร์แบบไม่ต่อเนื่อง (ด้วยเหตุผลหลายประการโปรดดูด้านล่าง) ในการแปลงฟูริเยร์คุณจะสลายสัญญาณเป็นชุดของฟังก์ชันตรีโกณมิติแบบออโธกอนอล (cos และ sin) มันเป็นสิ่งจำเป็นสำหรับพวกเขาที่จะเป็นมุมฉากเพื่อที่จะสามารถสลายสัญญาณของคุณในชุดของค่าสัมประสิทธิ์

ด้วยเกณฑ์ของ orthogonalityในใจเป็นไปได้หรือไม่ที่จะหาหน้าที่สองอย่างอื่นที่เป็น orthogonal นอกเหนือจาก cos และ sin?

ใช่มันเป็นไปได้ที่จะเกิดขึ้นกับฟังก์ชั่นดังกล่าวพร้อมกับคุณสมบัติที่มีประโยชน์เพิ่มเติมที่พวกเขาไม่ได้ขยายไปถึงอินฟินิตี้ (เช่น cos และบาปทำ) ตัวอย่างหนึ่งของคู่ดังกล่าวของฟังก์ชั่นเป็นHaar เวฟ

ตอนนี้ในแง่ของ DSP มันอาจจะมีประโยชน์มากกว่าถ้าคิดถึงฟังก์ชั่น orthogonal สองตัวนี้เป็นฟิลเตอร์ Finite Impulse Response (FIR) สองตัวและDiscrete Wavelet Transformเป็นชุดของ Convolutions (หรือกล่าวอีกนัยหนึ่ง ในบางช่วงเวลา) คุณสามารถตรวจสอบนี้โดยการเปรียบเทียบความแตกต่างของสูตร 1-D เดทเวทตันและที่บิด

ในความเป็นจริงถ้าคุณสังเกตเห็นฟังก์ชั่น Haar อย่างใกล้ชิดคุณจะเห็นตัวกรองสัญญาณความถี่ต่ำและตัวกรองความถี่สูง นี่คือตัวกรองความถี่ต่ำแบบง่าย ๆ h = [0.5,0.5] (ไม่ต้องกังวลเกี่ยวกับการปรับสเกลในขณะนี้) หรือที่เรียกว่าตัวกรองค่าเฉลี่ยเคลื่อนที่เนื่องจากมันจะส่งกลับค่าเฉลี่ยของทุกตัวอย่างที่อยู่ติดกันเป็นหลัก นี่คือฟิลเตอร์กรองความถี่สูงที่ง่ายมาก h = [1, -1] หรือที่เรียกว่าตัวสร้างความแตกต่างเนื่องจากมันจะคืนค่าความแตกต่างระหว่างตัวอย่างสองตัวอย่าง

ในการดำเนินการ DWT-IDWT กับภาพมันเป็นเพียงกรณีของการใช้รูปแบบสองมิติของการโน้มน้าวใจ (เพื่อใช้ตัวกรอง Haar ของคุณอย่างต่อเนื่อง)

บางทีตอนนี้คุณสามารถเริ่มดูว่าส่วนต่าง ๆ ของ LowLow, LowHigh, HighLow, HighHow และ HighHigh ที่ผ่านการ DWT มาจากไหน อย่างไรก็ตามโปรดทราบว่าภาพนั้นมีสองมิติอยู่แล้ว (อาจทำให้บางครั้งเกิดความสับสน) กล่าวอีกนัยหนึ่งคุณจะต้องได้รับความถี่เชิงพื้นที่ต่ำสูงสำหรับแกน X และช่วงเดียวกันสำหรับแกน Y (นี่คือสาเหตุที่มีระดับต่ำสองค่าและค่าสูงสุดสองค่าต่อแกน)

และอัลกอริทึมที่ใช้ซึ่งฉันสามารถเขียนรหัสสำหรับ 2D haar dwt?

คุณต้องลองรหัสนี้ด้วยตัวคุณเองจากหลักการแรกเพื่อให้คุณเข้าใจกระบวนการทั้งหมด มันง่ายมากที่จะหาโค้ดสำเร็จรูปที่จะทำสิ่งที่คุณกำลังมองหา แต่ฉันไม่แน่ใจว่าสิ่งนี้จะช่วยคุณในระยะยาวได้จริง

ฉันอาจผิดที่นี่ แต่ฉันคิดว่าเทคนิคการบีบอัด DWT และ DCT เนื่องจากขนาดภาพลดลงเมื่อดำเนินการ DWT หรือ DCT กับพวกเขา

นี่คือที่ที่ "จ่าย" เพื่อคิด DWT ในแง่ของการแปลงฟูริเยร์ ด้วยเหตุผลดังต่อไปนี้:

ในการแปลงฟูริเยร์ (และแน่นอน DCT ด้วย) คุณแปลงตัวอย่างจำนวนมาก (ในโดเมนเวลา) เป็นค่าสัมประสิทธิ์ ONE (ซับซ้อน) (ในโดเมนความถี่) นี่เป็นเพราะคุณสร้างไซนัสด์และโคไซนูสรอยด์ที่แตกต่างกันจากนั้นคูณมันด้วยสัญญาณของคุณและรับค่าเฉลี่ยของผลิตภัณฑ์นั้น ดังนั้นคุณรู้ไหมว่าค่าสัมประสิทธิ์ Ak เพียงอันเดียวนั้นแทนไซน์ซอยด์ความถี่ (k) ในสัญญาณของคุณ

ทีนี้ถ้าคุณดูฟังก์ชั่นเวฟเล็ตบางอันคุณจะสังเกตได้ว่ามันซับซ้อนกว่าไซนัสอยด์เล็กน้อย ตัวอย่างเช่นพิจารณาการแปลงฟูริเยร์ของตัวกรอง High Pass Haar ... ตัวกรอง High Pass Haar ดูเหมือนคลื่นสี่เหลี่ยมนั่นคือมีขอบที่คม (การเปลี่ยนที่คมชัด) ... สิ่งที่ต้องใช้ในการสร้าง 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 (โดย Mallat) และ; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (โดย Gilbert Strang)

ทั้งสองนี้เป็นหนังสือที่ยอดเยี่ยมในเรื่อง

ฉันหวังว่านี่จะช่วยได้

(ขออภัยฉันเพิ่งสังเกตเห็นว่าคำตอบนี้อาจใช้เวลานานเกินไป: - /)


ฉันดีใจที่คุณตอบกลับขอบคุณสำหรับการตอบกลับ A_A ขึ้นอยู่กับการตีความทางคณิตศาสตร์ของ DWT ที่ฉันพบในกระดาษ IEEE ฉันได้เขียนรหัสอย่างไรก็ตามทุกอย่างที่ฉันได้รับคือภาพสีดำโปรดช่วยฉันด้วย
user1320483

การเขียนรหัสเพื่อดำเนินการ DWT มีความหมายกับฉันมากจริงๆ (โปรด) ^ ∞ฉันจะขอบคุณจริงๆฉันได้โพสต์โค้ดด้านบน
user1320483

มีสองสิ่งที่ควรทราบในรหัสของคุณก) โปรดตรวจสอบสังวัตนาสองมิติ (ไม่ได้ง่ายกว่านี้ในกรณีนี้) และ b) โปรดทราบว่า "ภาพ" ของคุณคือชุดของค่าสัมประสิทธิ์ที่อาจ มีขนาดเล็กมากหรือใหญ่มากและไม่ว่าในกรณีใดก็ตามที่อยู่นอกช่วงไดนามิกทั่วไปของ 255 สี ดังนั้นคุณต้องค้นหาช่วงของค่าสัมประสิทธิ์ของคุณและปรับให้อยู่ในช่วง 0,255 คุณกำลังจะสลายตัวแค่ระดับเดียวเท่านั้น?
A_A

a) โปรดตรวจสอบการสนทนาแบบสองมิติ (ไม่ได้ง่ายกว่านี้ในกรณีนี้) ฉันไม่แน่ใจว่าคุณหมายถึงอะไร "image" เป็นชุดของค่าสัมประสิทธิ์ที่อาจมีขนาดเล็กมากหรือใหญ่มากและในกรณีใด ๆ ที่อยู่นอกช่วงไดนามิกทั่วไปของ 255 สีซึ่งหมายความว่าหลังจากเพิ่มฉันต้องตรวจสอบว่าค่าเกิน 255 และถ้าเริ่มจาก 0? คุณกำลังจะสลายตัวแค่ระดับเดียวเท่านั้น? ใช่ขอบคุณมาก
user1320483

สิ่งที่ฉันหมายถึงโดย (a) คือถ้าคุณต้องการที่จะใช้ตัวกรอง Haar (ตามคำตอบที่ระบุไว้ด้านบน) คุณจะต้องตรวจสอบสิ่งนี้ทำได้อย่างไรผ่านการทำงานของการบิดและในกรณีของตัวกรอง Haar นี้เป็นอย่างมาก ง่าย ใช่คุณต้องทำให้ค่าสัมประสิทธิ์ของคุณเป็นมาตรฐานในช่วง 0-255 เพื่อให้สามารถ "เห็น" พวกเขา เท่าที่เกี่ยวข้องกับ RGB โปรดมุ่งเน้นไปที่ภาพระดับสีเทา (เพียงค่าเดียว) คุณต้องเข้าใจก่อนว่าคุณต้องทำอะไรก่อน การค้นหา "รหัส" จะต้องใช้เวลามากขึ้นในระยะยาว
A_A

8

ฉันเริ่มเขียนสิ่งนี้ก่อนคำตอบจาก@A_Aแต่คำตอบนั้นยอดเยี่ยม ถึงกระนั้นฉันหวังว่าสิ่งต่อไปนี้อาจเพิ่มความเข้าใจของคุณเล็กน้อย

การอภิปรายเกี่ยวกับเวฟเล็ตและอื่น ๆ ตกอยู่ในการสนทนาทั่วไปเกี่ยวกับการสลายตัวพื้นฐานของสัญญาณ จากสิ่งนี้เราหมายความว่าเราสามารถเป็นตัวแทนของสัญญาณเป็นผลคูณของเมทริกซ์พื้นฐานและเวกเตอร์แทนสัญญาณของเราในทางเลือกพื้นฐาน (การสลายตัวพื้นฐาน),{x}} นั่นคือ: เมทริกซ์พื้นฐานเป็นเมทริกซ์ orthonormal ทั่วไป (เช่นเมทริกซ์ฟูเรียร์แบบไม่ต่อเนื่อง, เมทริกซ์ฟูเรียร์, Haar wavelet matrix) แต่ต้องการ ไม่เป็น - มีสาขาการวิจัยทั้งหมดที่มองหาการย่อยสลายสัญญาณในพจนานุกรมที่สมบูรณ์เกินไปหมายถึงxHx~

x=Hx~
HH กว้างกว่าสูง (เช่นผ่านอัลกอริธึม L1-norm ขั้นต่ำ)

แนวคิดที่อยู่เบื้องหลังการสลายตัวของสัญญาณแบบพื้นฐานคือสัญญาณสามารถถูกนำเสนอด้วยวิธีที่ดีกว่าในทางเลือกพื้นฐาน โดยดีกว่าเราหมายถึงว่าสัญญาณมีความอ่อนไหวต่อการประมวลผลหรือความเข้าใจหรืออะไรก็ตาม - มันไม่สำคัญเลย

ประเด็นที่ควรทราบคือโดยเฉพาะอย่างยิ่งเมื่อมีการแปลง Orthonormal สัญญาณของคุณยังคงเป็นสัญญาณของคุณไม่ว่าจะเป็นพื้นฐานอะไรคุณไม่ควรคิดว่าพื้นฐานเพียงอย่างเดียวเพราะเป็นโดเมนที่ถูกต้อง (ฉันใช้โดเมนเพื่อหมายถึงพื้นฐานในแง่ทั่วไป) .

ตอนนี้ฐานที่ต่างกันมีคุณสมบัติแตกต่างกัน ฉันแน่ใจว่าคุณเข้าใจทฤษฎีบทการสนทนาที่อธิบายความสัมพันธ์ที่เป็นประโยชน์ระหว่างโดเมนฟูริเยร์กับโดเมนเวลา สิ่งนี้ทำให้โดเมนฟูริเยร์มีประโยชน์สำหรับการดำเนินการโน้มน้าวโดเมนเวลา

โดยทั่วไปโดเมนเวลา (หรือพิกเซล) ถือได้ว่ามีความละเอียดเวลา (หรือพื้นที่) ที่ยอดเยี่ยมและความละเอียดความถี่ต่ำ ในทางกลับกันโดเมนฟูริเยร์ถือได้ว่ามีความละเอียดความถี่ที่ยอดเยี่ยมและความละเอียดเวลาที่ไม่ดี (หรือพื้นที่)

ฐานเวฟเล็ตอยู่ตรงกลางของสองด้านบน พวกเขามักจะมีความละเอียดความถี่ที่ดีและเวลาที่ดีหรือความละเอียดเชิงพื้นที่ คุณสมบัติหนึ่งของการแปลงเวฟเล็ตคือการแยกส่วนที่ดีของภาพธรรมชาติ จากนี้ฉันหมายถึงพลังงานจากภาพถูกบีบอัดลงในค่าสัมประสิทธิ์ขนาดใหญ่ไม่กี่และค่าสัมประสิทธิ์ขนาดเล็กจำนวนมาก ซึ่งหมายความว่าข้อมูลสำคัญที่สุดของสัญญาณจะแสดงด้วยชุดค่าที่ค่อนข้างเล็ก นี่คือสาระสำคัญของการบีบอัด

เวฟเล็ตต่างกันมีคุณสมบัติแตกต่างกัน นอกเหนือจากการอ้างอิงจาก @A_A ฉันยังแนะนำการสอน IEEE นี้ใน DTCWT จุดเน้นของการสอนไม่ได้อยู่ที่การแปลงเวฟเล็ตต่อแต่เหตุผลที่ฉันแนะนำมันเป็นเพราะความเข้าใจที่ยอดเยี่ยมมันนำเสนอเกี่ยวกับปัญหาที่เกี่ยวข้องกับ DWT และวิธีการที่พวกเขาอาจจะบรรเทาลงได้ (ฉันบอกว่ามันต้องมีความเข้าใจพื้นฐาน ก่อนอื่น) มันเชื่อมโยงความเข้าใจเกี่ยวกับเวฟเล็ตเข้าด้วยกันด้วยความเข้าใจในการแปลงฟูริเยร์และเหตุผลหลังจึงมีคุณสมบัติที่ดี

หากคุณต้องการโค้ดอ้างอิงเพิ่มเติมเกี่ยวกับการแปลง Haar ผู้ควบคุมงานเดิมของฉันมีตัวอย่าง matlab บนหน้าเว็บของเขา (ไฟล์ซิปใต้ "หลักสูตรการเข้ารหัสรูปภาพ 4F8", HAAR2D.M และ IHAAR2D.M) นี่เป็นตัวอย่างการสอนที่ดีมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.