Log in

View Full Version : Wavelet lifting decomposition implemented in avisynth, rounding errors


*.mp4 guy
21st February 2009, 23:38
I have implemented a linear prediction, linear filtering wavelet decomposition in avisynth. It is severely limited, but I implemented it mostly to try to get a better understanding of wavelet lifting, so this is not a problem I plan on fixing soon. It is however suffering from rounding and/or truncation errors, (rounding should be fixable, truncation is probably unfixable working within 8 bit colorspaces) Which I would Like to fix, my best guess is that the rounding errors are from the average plugin, or mt_lutxy, since it uses floats, however I am a bit confused, since as long as the rounding is deterministic, lifting should ensure that it does not result in errors in the decomposition. There is also a chrominance shift, which is most likely a problem with one of the mt_ functions.

The WaveletTest function will work on any yv12 input less then 1024*1024, and greater then 8*8, but for usefull results video should be between 256*256 and 1024*1024.


function afrb(clip c){ return(assumeframebased(c)) }
function afib(clip c){ return(assumefieldbased(c)) }

function wavelet_2_2_lifting_transform_1d_1_decomposition(clip c){

c = c.assumetff().afrb

Even = c.separatefields().selecteven()
Odd = c.separatefields().selectodd()

Prediction = average(Even, 0.5, Even.pointresize(Even.width, Even.height, 0, -1, Even.width, Even.height), 0.5)

Odd_Coeficients = Mt_MakeDiff(Odd, Prediction, u=3, v=3)

Update = average(Odd_Coeficients, 0.5, Odd_Coeficients.pointresize(Odd_Coeficients.width, Odd_Coeficients.height, 0, 1, Odd_Coeficients.width, Odd_Coeficients.height), 0.5)

Smoothed_Even = Mt_LutXY(Even, Update, " y 128 - 0.5 * x + ", u=3, v=3)

interleave(Smoothed_Even, Odd_Coeficients)
} function wt(clip c){ c.wavelet_2_2_lifting_transform_1d_1_decomposition() }



function inverse_wavelet_2_2_lifting_transform_1d_1_decomposition(clip Even, clip Odd_Coeficients){

Update = average(Odd_Coeficients, 0.5, Odd_Coeficients.pointresize(Odd_Coeficients.width, Odd_Coeficients.height, 0, 1, Odd_Coeficients.width, Odd_Coeficients.height), 0.5)

Even = Mt_LutXY(Even, Update, " x y 128 - 0.5 * - ", u=3, v=3)

Prediction = average(Even, 0.5, Even.pointresize(Even.width, Even.height, 0, -1, Even.width, Even.height), 0.5)

Odd = mt_adddiff(Prediction, Odd_Coeficients, u=3, v=3)

interleave(Even, Odd).afib().weave()
} function iwt(clip Even, clip Odd_Coeficients){ inverse_wavelet_2_2_lifting_transform_1d_1_decomposition(Even, Odd_Coeficients) }


function WaveletTest(clip c, int "thresh"){

thresh = default(thresh, 4)
W = c.width
H = c.height
c = c.addborders(1024 - W, 1024 - H, 0, 0)


DeompositionH1 = c.WT
EvenH1 = DeompositionH1.selecteven()
CoeficientsH1 = DeompositionH1.selectodd().Mt_lut( " X 128 - abs "+string(thresh/1)+" <= 128 x ? ", u=3, v=3)

DeompositionW1 = EvenH1.turnright.WT
EvenW1 = DeompositionW1.selecteven()
CoeficientsW1 = DeompositionW1.selectodd().Mt_lut( " X 128 - abs "+string(thresh/1)+" <= 128 x ? ", u=3, v=3)

DeompositionH2 = EvenW1.turnleft.WT
EvenH2 = DeompositionH2.selecteven()
CoeficientsH2 = DeompositionH2.selectodd().Mt_lut( " X 128 - abs "+string(thresh/2)+" <= 128 x ? ", u=3, v=3)

DeompositionW2 = EvenH2.turnright.WT
EvenW2 = DeompositionW2.selecteven()
CoeficientsW2 = DeompositionW2.selectodd().Mt_lut( " X 128 - abs "+string(thresh/2)+" <= 128 x ? ", u=3, v=3)

DeompositionH3 = EvenW2.turnleft.WT
EvenH3 = DeompositionH3.selecteven()
CoeficientsH3 = DeompositionH3.selectodd().Mt_lut( " X 128 - abs "+string(thresh/3)+" <= 128 x ? ", u=3, v=3)

DeompositionW3 = EvenH3.turnright.WT
EvenW3 = DeompositionW3.selecteven()
CoeficientsW3 = DeompositionW3.selectodd().Mt_lut( " X 128 - abs "+string(thresh/3)+" <= 128 x ? ", u=3, v=3)

DeompositionH4 = EvenW3.turnleft.WT
EvenH4 = DeompositionH4.selecteven()
CoeficientsH4 = DeompositionH4.selectodd().Mt_lut( " X 128 - abs "+string(thresh/4)+" <= 128 x ? ", u=3, v=3)

DeompositionW4 = EvenH4.turnright.WT
EvenW4 = DeompositionW4.selecteven()
CoeficientsW4 = DeompositionW4.selectodd().Mt_lut( " X 128 - abs "+string(thresh/4)+" <= 128 x ? ", u=3, v=3)

DeompositionH5 = EvenW4.turnleft.WT
EvenH5 = DeompositionH5.selecteven()
CoeficientsH5 = DeompositionH5.selectodd().Mt_lut( " X 128 - abs "+string(thresh/5)+" <= 128 x ? ", u=3, v=3)

DeompositionW5 = EvenH5.turnright.WT
EvenW5 = DeompositionW5.selecteven()
CoeficientsW5 = DeompositionW5.selectodd().Mt_lut( " X 128 - abs "+string(thresh/5)+" <= 128 x ? ", u=3, v=3)

DeompositionH6 = EvenW5.turnleft.WT
EvenH6 = DeompositionH6.selecteven()
CoeficientsH6 = DeompositionH6.selectodd().Mt_lut( " X 128 - abs "+string(thresh/6)+" <= 128 x ? ", u=3, v=3)

DeompositionW6 = EvenH6.turnright.WT
EvenW6 = DeompositionW6.selecteven()
CoeficientsW6 = DeompositionW6.selectodd().Mt_lut( " X 128 - abs "+string(thresh/6)+" <= 128 x ? ", u=3, v=3)

DeompositionH7 = EvenW6.turnleft.WT
EvenH7 = DeompositionH7.selecteven()
CoeficientsH7 = DeompositionH7.selectodd().Mt_lut( " X 128 - abs "+string(thresh/7)+" <= 128 x ? ", u=3, v=3)

DeompositionW7 = EvenH7.turnright.WT
EvenW7 = DeompositionW7.selecteven()
CoeficientsW7 = DeompositionW7.selectodd().Mt_lut( " X 128 - abs "+string(thresh/7)+" <= 128 x ? ", u=3, v=3)

DeompositionH8 = EvenW7.turnleft.WT
EvenH8 = DeompositionH8.selecteven()
CoeficientsH8 = DeompositionH8.selectodd().Mt_lut( " X 128 - abs "+string(thresh/8)+" <= 128 x ? ", u=3, v=3)

DeompositionW8 = EvenH8.turnright.WT
EvenW8 = DeompositionW8.selecteven()
CoeficientsW8 = DeompositionW8.selectodd().Mt_lut( " X 128 - abs "+string(thresh/8)+" <= 128 x ? ", u=3, v=3)


## Recomposition

EvenH8 = iwt(EvenW8, CoeficientsW8).turnleft
EvenW7 = iwt(EvenH8, CoeficientsH8).Turnright

EvenH7 = iwt(EvenW7, CoeficientsW7).turnleft
EvenW6 = iwt(EvenH7, CoeficientsH7).Turnright

EvenH6 = iwt(EvenW6, CoeficientsW6).turnleft
EvenW5 = iwt(EvenH6, CoeficientsH6).Turnright

EvenH5 = iwt(EvenW5, CoeficientsW5).turnleft
EvenW4 = iwt(EvenH5, CoeficientsH5).Turnright

EvenH4 = iwt(EvenW4, CoeficientsW4).turnleft
EvenW3 = iwt(EvenH4, CoeficientsH4).Turnright

EvenH3 = iwt(EvenW3, CoeficientsW3).turnleft
EvenW2 = iwt(EvenH3, CoeficientsH3).Turnright

EvenH2 = iwt(EvenW2, CoeficientsW2).turnleft
EvenW1 = iwt(EvenH2, CoeficientsH2).Turnright

EvenH1 = iwt(EvenW1, CoeficientsW1).turnleft
Complete = iwt(EvenH1, CoeficientsH1)

complete.crop(1024 - W, 1024 - H, 0, 0)
}