WarpAffine does not properly support linear interpolation

WarpAffine does not properly support linear interpolation

Portrait de anniezh

I used WarpAffine in my application. I found WarpAffine did not properly support linear interpolation except for pure translation. I did the resize {{xFactor, 0.0, 0.0}, {0.0, yFactor, 0.0}} using WarpAffine and got the same result using NN or linear interpolation. I did the same tests for Shear using WarpAffine and also got the same results using NN or linear interpolation.

Could you please let me know if there is an issue with WarpAffine support for different interpolation methods?

14 posts / 0 nouveau(x)
Dernière contribution
Reportez-vous à notre Notice d'optimisation pour plus d'informations sur les choix et l'optimisation des performances dans les produits logiciels Intel.
Portrait de Sergey Kostrov

Please provide more details about version of IPP you're using and exact name of WarpAffine function. There are many WarpAffine functions in two IPP domains, that is, Image Processing and Realistic Rendering.

Portrait de anniezh

The exact function name is "WarpAffine" in Image and Video processing. I used IPP version 7.0. Thanks.

Portrait de Sergey Kostrov

I don't see any IPP functions with WarpAffine name. However, there are lots of ippi-functions with names like:
...
IPPAPI(IppStatus, ippiWarpAffine_8u_C1R...
IPPAPI(IppStatus, ippiWarpAffine_8u_C3R...
IPPAPI(IppStatus, ippiWarpAffine_8u_C4R...
IPPAPI(IppStatus, ippiWarpAffine_8u_AC4R...
IPPAPI(IppStatus, ippiWarpAffine_8u_P3R...
IPPAPI(IppStatus, ippiWarpAffine_8u_P4R...
IPPAPI(IppStatus, ippiWarpAffine_16u_C1R...
IPPAPI(IppStatus, ippiWarpAffine_16u_C3R...
IPPAPI(IppStatus, ippiWarpAffine_16u_C4R...
IPPAPI(IppStatus, ippiWarpAffine_16u_AC4R...
IPPAPI(IppStatus, ippiWarpAffine_16u_P3R...
IPPAPI(IppStatus, ippiWarpAffine_16u_P4R...
IPPAPI(IppStatus, ippiWarpAffine_32f_C1R...
IPPAPI(IppStatus, ippiWarpAffine_32f_C3R...
IPPAPI(IppStatus, ippiWarpAffine_32f_C4R...
IPPAPI(IppStatus, ippiWarpAffine_32f_AC4R...
IPPAPI(IppStatus, ippiWarpAffine_32f_P3R...
IPPAPI(IppStatus, ippiWarpAffine_32f_P4R...
IPPAPI(IppStatus, ippiWarpAffine_64f_C1R...
IPPAPI(IppStatus, ippiWarpAffine_64f_C3R...
IPPAPI(IppStatus, ippiWarpAffine_64f_C4R...
IPPAPI(IppStatus, ippiWarpAffine_64f_AC4R...
IPPAPI(IppStatus, ippiWarpAffine_64f_P3R...
IPPAPI(IppStatus, ippiWarpAffine_64f_P4R...
...
and many more.

Portrait de anniezh

I used ippiWarpAffine_32f_C1R for the testing. I used coeffs = {{ { 0.5, 0.0, 0.0}, {0.0, 0.5, 0.0} }; for resize test and coeffs = { { 1.0, 0, 0.0}, {0.5, 1.0, 0.0} };for shear test.

Portrait de Valentin Kubarev (Intel)

Hi anniezh,

Could you please provide sample code with ippiWarpAffine_32f_C1R function usage, and the input/output images for NN and linear interpolation, which were obtained.

Regards, Valentin

Portrait de anniezh

Hi Valentin,

Here is the sample code:

octet* pSrc = src_data.get_indexed_offset(0, 0);  octet* pDst = dst_data.get_indexed_offset(0, 0);

 Imaging::DimensionSize src_dimx = src_data.get_dim_length(0);     Imaging::DimensionSize src_dimy = src_data.get_dim_length(1);

 IppiSize size_src_xy = {(int) src_dimx, (int) src_dimy};  IppiRect srcROI = {0, 0, (int) src_dimx, (int) src_dimy};

 int srcStep = (int) src_data.get_dim_stride(1); // length in bytes of each row (see IPP documentation)  int dstStep = (int) dst_data.get_dim_stride(1); // length in bytes of each row (see IPP documentation)

 IppiRect dstROI = {0, 0, (int) dst_data.get_dim_length(0), (int) dst_data.get_dim_length(1)};

 ippStatus = ippiWarpAffine_32f_C1R((Ipp32f*)pSrc, srcSize, srcStep, srcRoi, (Ipp32f*)pDst, dstStep, dstRoi, coeffs, interpolationType);

One can do the testing by passing different coeffs and interpolationType.

I tried resize using coeffs = { { 0.5, 0.0, 0.0}, {0.0, 0.5, 0.0} }; interpolationType as 1 or 2. Got exactly the same result image.

shear using coeffs = { { 1.0, 0.0, 0.0}, {0.5, 1.0, 0.0} }; interpolationType as 1 or 2. Got exactly the same result image.

Attached please find the images.

Regards,

Annie

 

 

 

 

Fichiers joints: 

Fichier attachéTaille
Téléchargement real4.zip41.56 Mo
Portrait de anniezh

Hi Valentin,

Can you reproduce the problem I found when using ippiWarpAffine_32f_C1R? Is this a software bug? Thanks.

Annie

 

Portrait de Valentin Kubarev (Intel)

Hi Annie,

I was on vacation and now I am investigating this issue.

Regards, Valentin

Portrait de Valentin Kubarev (Intel)

Hi Annie,

Sorry for the delay with the answer. I have investigated this issue. It has turned out that the root cause of the issue consists in the transformation coefficients. If the source indices calculated by the function are integer, the linear interpolation is computed with the coefficients {0,1} that is equal to Nearest Neighbor interpolation.
You can check that the function works with linear interpolation by changing coefficients from { { 0.5, 0.0, 0.0}, {0.0, 0.5, 0.0} } to { { 0.55, 0.0, 0.0}, {0.0, 0.55, 0.0} } for example. 

Thanks, Valentin

Portrait de anniezh

Hi Valentin,

Thanks for your reply! I think the interplation type that the function apply should depends on the interplation type that the user pass in, not on the coefficients that the user pass in. The function should work with linear interplation for all coefficients as long as the user choose the interplation type as linear interplation. Please let me know what you think. Thanks.

Annie

 

 

 

Portrait de Valentin Kubarev (Intel)

Hi Annie,

The current function implementation calculates a new position for each pixel by rotation of the top-left pixel corner. This approach gives the same results for nearest neighbor and linear interpolations, if the source image size is multiple of the destination image size.

Best regards, Valentin

Portrait de anniezh

Hi Valentin,

I tested ippiResizeSqrPixel_32f_C1R to resize the image in half. Use Nearest neighbor vs linear interpolation give different results, while use ippiWarpAffine_32f_C1R to resize the image in half, nearest neighbor and linear interpolation give the same results. Is there something wrong with the WarpAffine calculation? Thanks,

Annie

 

 

Portrait de Valentin Kubarev (Intel)

Hi Annie,

ippiWarpAffine_32f_C1R considers an image as a grid with pixels as nodes, while ResizeSqrPixel considers pixels as "squares". Thus these functions use the different approaches for image transformation.

Best regards, Valentin

Connectez-vous pour laisser un commentaire.