- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am experiencing a problem with the ippiResizeSqrPixel_8u_C1R function when using IPPI_INTER_CUBIC interpolation (I tried also IPPI_INTER_LANCZOS and it seems to be the same, while IPPI_INTER_NN and IPPI_INTER_LINEAR work fine).
Basically, I have a 100x100 image (1 byte = 1 pixel) with all pixels set to 0, except for the top-left quarter of this image, which I set to another value (128). By resizing this image, for instance to a size of 84x86, I obtain a strange pattern, with some row and column portions showing a value of 127. I am attaching here the source and destination image (.bmp), and also a .jpg image with a different palette, to highlight the artifact's shape.
This seems to be some kind of rounding problem with floating point computation, but I was wondering if this is expected. I also noticed that an analogous call to the old (deprecated) ippiResize_8u_C1R, again with IPPI_INTER_CUBIC interpolation, did not cause the same problem.
I am using Intel IPP 6.1 (in case there are many subversions, mine is the one distributed with Intel Compiler 11.1.046), statically linked with dispatching (I tried both the threaded and not threaded version).
I am running my program on an Intel Xeon CPU (2 quad core processors). A call to ippGetCpuType() on my workstation returns ippCpuPenryn.
I am providing here the code I used, so that you can check if I misunderstood something about these functions.
{
int iSizeX_Src = 100;
int iSizeY_Src = 100;
double xFactor = 0.84;
double yFactor = 0.86;
int iSizeX_Dst = (int) (0.5 + (xFactor * (double)iSizeX_Src));
int iSizeY_Dst = (int) (0.5 + (yFactor * (double)iSizeY_Src));
int iSrcStepBytes;
int iDstStepBytes;
Ipp8u* pSrc = ippiMalloc_8u_C1(iSizeX_Src, iSizeY_Src, &iSrcStepBytes);
Ipp8u* pDst = ippiMalloc_8u_C1(iSizeX_Dst, iSizeY_Dst, &iDstStepBytes);
IppiSize srcSize; srcSize.width = iSizeX_Src; srcSize.height = iSizeY_Src;
IppiSize dstSize; dstSize.width = iSizeX_Dst; dstSize.height = iSizeY_Dst;
ippiSet_8u_C1R(0, pSrc, iSrcStepBytes, srcSize);
ippiSet_8u_C1R(0, pDst, iDstStepBytes, dstSize);
// Set the value 128 to the top left-quarter of the source image
IppiSize srcRoiSize_1; srcRoiSize_1.width = 50; srcRoiSize_1.height = 50;
ippiSet_8u_C1R(128, pSrc, iSrcStepBytes, srcRoiSize_1);
IppiRect srcRoi;
srcRoi.x = 0; srcRoi.y = 0;
srcRoi.width = srcSize.width;
srcRoi.height = srcSize.height;
IppiRect dstRoi;
dstRoi.x = 0; dstRoi.y = 0;
dstRoi.width = dstSize.width;
dstRoi.height = dstSize.height;
int interpolation = IPPI_INTER_CUBIC;
int iBufferSize;
ippiResizeGetBufSize (srcRoi, dstRoi, 1, interpolation, &iBufferSize);
Ipp8u* pBuffer = ippsMalloc_8u(iBufferSize);
ippiResizeSqrPixel_8u_C1R ( pSrc, srcSize, iSrcStepBytes, srcRoi, pDst, iDstStepBytes, dstRoi, xFactor, yFactor, 0, 0, interpolation, pBuffer );
ippsFree(pBuffer);
ippiFree(pSrc);
ippiFree(pDst);
}
----> resize ----> ----> zoom + change palette ---->
Thanks in advance, regards.
Carlo
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Regards,
Carlo
Carlo,
Thank you a lot for the test. Looks it is really abug with penryn cpu optimization.We will fix it in next release. For now, you may work around the issue by setting
if ippCpuPenryn==ippGetCpuType()
{ippStaticInitCpu(ippCpuC2D)
} or other methed.
Thanks
Ying
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Carlo,
I recalled, thereis aippiResizeSqrtPixelissue fixed in latest IPP 6.1.2 version.
See http://software.intel.com/en-us/articles/intel-ipp-library-61-fixes-list/
and note 2: in http://software.intel.com/en-us/forums/showthread.php?t=69755
Would you like to try the IPP 6.1.2 version and see if the problem is gone?
You can get the install package from Intel registraction center and if compiler pro version, it is 11.1.051
Which version of Intel IPP, Intel MKL and Intel TBB is installed by the Intel Compiler Professional Edition?
Regards,
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I did quick test on my laptop, IBM T61 with IPP 6.1 udpate 1
ippCpuC2D = 0x21, /* Intel Core 2 Duo processor
The function works no problem, no 127 in the resized image.
Looks the cpu type is key of the problem.
Do you have other machines, for example (ippCpuC2D or ippCpuC2Q) to test if it has different behavious?
Regards,
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I did quick test on my laptop, IBM T61 with IPP 6.1 udpate 1
ippCpuC2D = 0x21, /* Intel Core 2 Duo processor
The function works no problem, no 127 in the resized image.
Looks the cpu type is key of the problem.
Do you have other machines, for example (ippCpuC2D or ippCpuC2Q) to test if it has different behavious?
Regards,
Ying
Hi Ying,
I tested the same code on two different CPU types (one ippCpuEM64T and one ippCpuC2D, as yours) and, indeed, I did not have the same problem.
I am also going to try IPP 6.1 update 2 soon, as you suggested, to see if something has changed for the ippCpuPenryn type, too.
Thanks for your support, regards
Carlo
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Regards,
Carlo
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Regards,
Carlo
Carlo,
Thank you a lot for the test. Looks it is really abug with penryn cpu optimization.We will fix it in next release. For now, you may work around the issue by setting
if ippCpuPenryn==ippGetCpuType()
{ippStaticInitCpu(ippCpuC2D)
} or other methed.
Thanks
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Carlo,
Thank you a lot for the test. Looks it is really abug with penryn cpu optimization.We will fix it in next release. For now, you may work around the issue by setting
if ippCpuPenryn==ippGetCpuType()
{ippStaticInitCpu(ippCpuC2D)
} or other methed.
Thanks
Ying
Ok, thanks to you.
Regards,
Carlo
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page