Community
cancel
Showing results for 
Search instead for 
Did you mean: 
umundry
Beginner
61 Views

2D Wavelet example test implementation problem

I am having a problem with ref. Below is my implementation. The forward transform works fine, I can see the 4 output images look good. The problem is with the inverse, its output (to be the same image dimensions as the input image, image is square (orgWidth==orgHeight)) has aliasing and it looks like every second row and every second column content is blank. I can't find a way to embed an output image here. Please let me know how I can get that to you in case you want to take a look.

Can you please check and see what the problem may be?

Thank you!!

IppStatus ippStatus = ippStsNoErr;

 IppiWTFwdSpec_32f_C1R* pSpecFwd;
 IppiWTInvSpec_32f_C1R* pSpecInv;
 int specSizeFwd, specSizeInv;
 Ipp32f pTapsLow[3] = { 0.25, 0.5, 0.25 };
 int lenLow = 3;
 int anchorLow = 1;
 Ipp32f pTapsHigh[3] = { 0.75, -0.25, -0.125 };
 int lenHigh = 3;
 int anchorHigh = 1;

 int sourceBWidth = orgWidth + 1;
 int sourceBArraySize = sourceBWidth * sourceBWidth;

 Ipp32f *pSrcB = new Ipp32f[sourceBArraySize];
 int srcStepB = sourceBWidth * sizeof(Ipp32f);
 IppiSize roiSizeB = { sourceBWidth, sourceBWidth };
 int srcStep = orgWidth * sizeof(Ipp32f);
 IppiSize roiSize = { orgWidth, orgWidth };

 int subWidth = orgWidth / 2;

 Ipp32f *pDetailXDst = new Ipp32f[subWidth * subWidth];
 Ipp32f *pDetailYDst = new Ipp32f[subWidth * subWidth];
 Ipp32f *pDetailXYDst = new Ipp32f[subWidth * subWidth];
 Ipp32f *pApproxDst = new Ipp32f[subWidth * subWidth];

 IppiSize dstRoiSize = { subWidth, subWidth };
 int bufSizeFwd, bufSizeInv;
 Ipp8u* pBufferFwd;
 Ipp8u* pBufferInv;
 IppiSize roiInvSize = { subWidth, subWidth };
 int stepDstInv = orgWidth * sizeof(Ipp32f);

 int subWidthPlusOne = subWidth + 1;
 Ipp32f *pAppB = new Ipp32f[subWidthPlusOne * subWidthPlusOne];
 Ipp32f *pXB = new Ipp32f[subWidthPlusOne * subWidthPlusOne];
 Ipp32f *pYB = new Ipp32f[subWidthPlusOne * subWidthPlusOne];
 Ipp32f *pXYB = new Ipp32f[subWidthPlusOne * subWidthPlusOne];
 int StepB = subWidthPlusOne * sizeof(Ipp32f);

 IppiSize roiInvSizeB = { (subWidth + 1), (subWidth + 1) };
 int approxStep, detailXStep, detailYStep, detailXYStep;
 approxStep = detailXStep = detailYStep = detailXYStep = subWidth * sizeof(Ipp32f);
 //adds border to the source image
 ippStatus = ippiCopyWrapBorder_32s_C1R((Ipp32s*)pSrc, srcStep, roiSize, (Ipp32s*)pSrcB, srcStepB, roiSizeB, 1, 1);
 //performs forward  wavelet transform 
 ippStatus = ippiWTFwdGetSize_32f(1, lenLow, anchorLow, lenHigh, anchorHigh, &specSizeFwd, &bufSizeFwd);
 pSpecFwd = (IppiWTFwdSpec_32f_C1R*)ippMalloc(specSizeFwd);
 pBufferFwd = (Ipp8u*)ippMalloc(bufSizeFwd);
 ippStatus = ippiWTFwdInit_32f_C1R(pSpecFwd, pTapsLow, lenLow, anchorLow, pTapsHigh, lenHigh, anchorHigh);
 ippStatus = ippiWTFwd_32f_C1R(pSrcB + roiSizeB.width + 1, srcStepB, pApproxDst, approxStep,
  pDetailXDst, detailXStep, pDetailYDst, detailYStep, pDetailXYDst, detailXYStep, dstRoiSize, pSpecFwd, pBufferFwd);



/* ippStatus = ippiCopy_32f_C1R(pApproxDst, approxStep, pDst, srcStep, dstRoiSize);
 ippStatus = ippiCopy_32f_C1R(pDetailXDst, approxStep, pDst + subWidth, srcStep, dstRoiSize);
 ippStatus = ippiCopy_32f_C1R(pDetailYDst, approxStep, pDst + (subWidth * m_nVolLoadedX), srcStep, dstRoiSize);
 ippStatus = ippiCopy_32f_C1R(pDetailXYDst, approxStep, pDst + subWidth + (subWidth * m_nVolLoadedX), srcStep, dstRoiSize);
*/

 ippStatus = ippiWTInvGetSize_32f(1, lenLow, anchorLow, lenHigh, anchorHigh, &specSizeInv, &bufSizeInv);
 pSpecInv = (IppiWTInvSpec_32f_C1R*)ippMalloc(specSizeInv);
 pBufferInv = (Ipp8u*)ippMalloc(bufSizeInv);
 ippStatus = ippiWTInvInit_32f_C1R(pSpecInv, pTapsLow, lenLow, anchorLow, pTapsHigh, lenHigh, anchorHigh);
 //adds border to four images obtained after ippiWTFwd
 ippStatus = ippiCopyWrapBorder_32s_C1R((Ipp32s*)pApproxDst, approxStep, dstRoiSize, (Ipp32s*)pAppB, StepB, roiInvSizeB, 0, 0);
 ippStatus = ippiCopyWrapBorder_32s_C1R((Ipp32s*)pDetailXDst, detailXStep, dstRoiSize, (Ipp32s*)pXB, StepB, roiInvSizeB, 0, 0);
 ippStatus = ippiCopyWrapBorder_32s_C1R((Ipp32s*)pDetailYDst, detailYStep, dstRoiSize, (Ipp32s*)pYB, StepB, roiInvSizeB, 0, 0);
 ippStatus = ippiCopyWrapBorder_32s_C1R((Ipp32s*)pDetailXYDst, detailXYStep, dstRoiSize, (Ipp32s*)pXYB, StepB, roiInvSizeB, 0, 0);
 //performs inverse  wavelet transform   
 ippStatus = ippiWTInv_32f_C1R(pAppB, StepB, pXB, StepB, pYB, StepB, pXYB, StepB, roiInvSize, pDst, stepDstInv, pSpecInv, pBufferInv);

// printf_32f_2D("After WTFinv ->\n pDstInv", pDst, roiSize, stepDstInv, ippStsNoErr);

 ippFree(pSpecFwd);
 ippFree(pSpecInv);
 ippFree(pBufferFwd);
 ippFree(pBufferInv);

 

0 Kudos
4 Replies
umundry
Beginner
61 Views

I found a way to upload images, they are attached. So here is the forward output as well as the inverse output. Note, the input image has homogeneous constant pixel values to make visualizing the problem easier.

Thank you!

Chao_Y_Intel
Employee
61 Views

Hello,

For the wavelet transform, it need to correctly extend the borders for the input data.  I attached some example that shows the orthogonal and biorthogonal wavelet for the perfect transform.

umundry
Beginner
61 Views

Thank you Chao!

I have the Ortho4 and Ortho6 working, but the test2d is giving me trouble. Can you please explain where the 12 in

Ipp32f pSrcB[16*16];

is coming from?

Thanks!

umundry
Beginner
61 Views

Sorry, I meant to ask where is the 16 coming from :-)

Reply