I am trying to do DWT steganography. I first obtain the DiscreteWaveletTransform of the image as follows
dwd = DiscreteWaveletTransform[carrierImage, HaarWavelet[], 1]
(* Out: DiscreteWaveletData[<< DWT >>, < 1 >, {256, 256}] *)
This splits the image into four separate images that can be obtained with dwd[All, "Image"], but when I use those with InverseWaveletTransform I get a blurred version of the original image. Why is it so?
MWE to recreate the problem:
img = ExampleData[{"TestImage", "Lena"}];
dwd = DiscreteWaveletTransform[img, HaarWavelet[], 1];
newdwd = DiscreteWaveletData[dwd[All, "Image"], HaarWavelet[], DiscreteWaveletTransform];
Row[{
Show[InverseWaveletTransform[newdwd], ImageSize -> 200],
Show[InverseWaveletTransform[dwd], ImageSize -> 200]
}]

For @JasonB it's even worse (image link copied from his comment):


DiscreteWaveletDataobject before. If you compare the filesFullForm[dwd] >> "test1.txt"; FullForm[newdwd] >> "test2.txt";you see that test1.txt is 889 lines longer... – Jason B. Mar 14 '16 at 16:19newdwdis not a properly constructedDiscreteWaveletDataobject. Trynewdwd["TreeView"]andnewdwd[All, "Image"]versusdwd["TreeView"]anddwd[All, "Image"]. Perhaps you could rephrase the question "How can I reconstruct a discrete wavelet data object from its constituent parts?" – Jason B. Mar 14 '16 at 16:30newdwdlooks, at first blush, to be exactly the same asdwdin the notebook interface. The same wavelet, the same transform, the same dimension etc. Now{Dimensions@First@#, Quiet@Rest@#} & /@ {dwd, newdwd}reveals that in one parameter they differ, but it's unclear what that parameter does or if it can be set. AnywayInverseWaveletTransformshould use the Haar wavelet as it does when it invertsdwd. – C. E. Mar 14 '16 at 17:02