Forum Jump

Select Group :
Select Forum :
Sorted By :
Sort Order :
From The :
 
Thread Tools  Search this thread 
mahantesh
Total Points:
115
Status Points:
65
Green Belt
July 2, 2009 1:41 PM PDT
Need help on Image rotation.
Hi,

When we rotate image by 90 degree using ippiRotate_8u_C4R() , for MxN resolutions the output is MxN image with 2 black strips at the sides of the image. Is it possible to get rid of these black strips? Is it possible to change the size of the image to NXM ? or Is it possible to change the size of the image to MxM ?

We are trying to remove these black strips by the calling the function ippiRotate_8u_C4R() and then ippiResizeShift_8u_C4R(), this does the trick but image get stretched and there is peformance hit in our application because of calling two functions. Is there any other way to acieve this through a single call ?

Thanks,
Mahantesh

matthieu.darbois
Total Points:
1,025
Status Points:
525
Brown Belt
July 3, 2009 1:12 AM PDT
Rate
 
#1
Quoting - mahantesh
Hi,

When we rotate image by 90 degree using ippiRotate_8u_C4R() , for MxN resolutions the output is MxN image with 2 black strips at the sides of the image. Is it possible to get rid of these black strips? Is it possible to change the size of the image to NXM ? or Is it possible to change the size of the image to MxM ?

We are trying to remove these black strips by the calling the function ippiRotate_8u_C4R() and then ippiResizeShift_8u_C4R(), this does the trick but image get stretched and there is peformance hit in our application because of calling two functions. Is there any other way to acieve this through a single call ?

Thanks,
Mahantesh


Hi,
I've never used ippiRotate_... for 90, 180, 270 degree rotations, instead I use a combination of mirror and/or transpose functions. I never had time to check if it was faster than ippiRotate but at least I'm sure to get an exact rotation (no rounding...).

For a 90 degree rotation :
ippiMirror_8u_C1R(pSrc, srcStep, pTempBuffer, srcStep, srcSize, ippAxsHorizontal);
ippiTranspose_8u_C1R(pTempBuffer, srcStep, pDst, dstStep, dstSize);
with dstSize.width = srcSize.height...

For a 270 degree rotation :
ippiTranspose_8u_C1R(pSrc, srcStep, pTempBuffer, dstStep, srcSize);
ippiMirror_8u_C1R(pTempBuffer, dstStep, pDst, dstStep, dstSize, ippAxsHorizontal);

For a 180 degree rotation :
ippiMirror_8u_C1R(pSrc, srcStep, pDst, dstStep, roiSize, ippAxsBoth);


Matthieu


Ying H (Intel)
Total Points:
5,187
Status Points:
4,687
Brown Belt
July 6, 2009 12:52 AM PDT
Rate
 
#2 Reply to #1

Hi Matthieu,

Thank you for your suggestion. Yes, we recomment to use ippiMirror to do special rotation like 90,180,270.

To mahantesh,

if use ippiRotate, the no-intergate interpolation, round issue are unavaidable.  ippiRotate provide one parameter IPPI_SMOOTH_EDGE to make edge look better.  But the black strips may still visiable. how width of the strips in your test? does it affect your result?

Here is small piece of code for your reference.

 IppiSize srcTempSize = {w, h};
 IppiSize dstTempSize = {h, w};

IppiRect srcTempRect = { 0, 0,w, h };
IppiRect dstTempRect = { 0, 0,h, w };
 double xTempShift = 0.0;
 double yTempShift = 1.0*w; // conterwise rotate 90 degree, origin (0, 0) will be (0, w) after rotation, so the y shift is w

/* Use this function if you need to rotate an image about an arbitrary center (xCenter, yCenter) rather than the origin (0,0), we will rotate the image by 0, 0 first, so it is not necessary to call it here
/*
//ippiGetRotateShift(0.0, 0.0, 90.0, &xTempShift, &yTempShift);

ippiSet_8u_C4R ( 0, (Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempSize );
status=ippiRotate_8u_C4R ( (Ipp8u*) srcTemp->imageData, srcTempSize, srcTemp->widthStep, srcTempRect,
       (Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempRect, 90.0,
    xTempShift, yTempShift, IPPI_INTER_LINEAR|IPPI_SMOOTH_EDGE);
//my test: the rotate operation will show 1 pixel width black line on upper of the rotated image)

Best Regards,
Ying
 



mahantesh
Total Points:
115
Status Points:
65
Green Belt
September 9, 2009 5:07 PM PDT
Rate
 
#3 Reply to #2
Quoting - Ying Hu (Intel)

Hi Matthieu,

Thank you for your suggestion. Yes, we recomment to use ippiMirror to do special rotation like 90,180,270.

To mahantesh,

if use ippiRotate, the no-intergate interpolation, round issue are unavaidable.  ippiRotate provide one parameter IPPI_SMOOTH_EDGE to make edge look better.  But the black strips may still visiable. how width of the strips in your test? does it affect your result?

Here is small piece of code for your reference.

IppiSize srcTempSize = {w, h};
IppiSize dstTempSize = {h, w};

IppiRect srcTempRect = { 0, 0,w, h };
IppiRect dstTempRect = { 0, 0,h, w };
double xTempShift = 0.0;
double yTempShift = 1.0*w; // conterwise rotate 90 degree, origin (0, 0) will be (0, w) after rotation, so the y shift is w

/* Use this function if you need to rotate an image about an arbitrary center (xCenter, yCenter) rather than the origin (0,0), we will rotate the image by 0, 0 first, so it is not necessary to call it here
/*
//ippiGetRotateShift(0.0, 0.0, 90.0, &xTempShift, &yTempShift);

ippiSet_8u_C4R ( 0, (Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempSize );
status=ippiRotate_8u_C4R ( (Ipp8u*) srcTemp->imageData, srcTempSize, srcTemp->widthStep, srcTempRect,
(Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempRect, 90.0,
xTempShift, yTempShift, IPPI_INTER_LINEAR|IPPI_SMOOTH_EDGE);
//my test: the rotate operation will show 1 pixel width black line on upper of the rotated image)

Best Regards,
Ying


Hi Ying,

Thanks for the pointers to rotate the image. The rotation is working good for all the resolutions except for 160 x 120. Is there anything we need to take care for lower resolutions?

Thanks,
Mahantesh



Ying H (Intel)
Total Points:
5,187
Status Points:
4,687
Brown Belt
September 10, 2009 11:55 PM PDT
Rate
 
#4 Reply to #3

Hello Mahantesh,

Which IPP vesion are you using?  There are some known issue regarding the ippiResize() at
http://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/66171/

Maybe same. What is symptom when resize the 160x120?

Best Regards,
Ying



mahantesh
Total Points:
115
Status Points:
65
Green Belt
September 11, 2009 3:45 PM PDT
Rate
 
#5 Reply to #4
Quoting - Ying H (Intel)

Hello Mahantesh,

Which IPP vesion are you using?  There are some known issue regarding the ippiResize() at
http://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/66171/

Maybe same. What is symptom when resize the 160x120?

Best Regards,
Ying

Hi Ying,

I am using IPP 6.1.1.035. For rotation i am using ippiRotate followed by ippiMirror functions to remove the mirroring effect. The image looks like folded lines for the resoltion 160 x 120.

Thanks,
Mahantesh


Ying H (Intel)
Total Points:
5,187
Status Points:
4,687
Brown Belt
September 14, 2009 4:18 AM PDT
Rate
 
#6 Reply to #5

Hi Mahantesh, 
Thank you for your reply. I don't rememeber there is known issue for rotating 160x120 specially.

could you send me a example?

Best Regards,
Ying


mahantesh
Total Points:
115
Status Points:
65
Green Belt
September 15, 2009 2:20 PM PDT
Rate
 
#7 Reply to #6
Quoting - Ying H (Intel)

Hi Mahantesh, 
Thank you for your reply. I don't rememeber there is known issue for rotating 160x120 specially.

could you send me a example?

Best Regards,
Ying

Hi Ying,

I tested this behavior on different systems. On some systems it works good but on some other systems it is like images is turned in to roles. I tried to take print screen but it is coming blank. We are actually rotating video with the help of roation functions.

One more problem i am facing is, on some systems the rotation along with mirroring function works fine but on some systmes we are getting mirror effect. Not able to judge when to apply mirroring functions and when not to apply. Please let me know when to use mirroring functions and when not to use.

Thanks,
Mahantesh




Ying H (Intel)
Total Points:
5,187
Status Points:
4,687
Brown Belt
September 16, 2009 1:38 AM PDT
Rate
 
#8 Reply to #7


Hi Mahantesh,

Did you notice which kind of system (CPU type and OS) have the problem?  You may check your cpu type by the way I list in http://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/68333  =>item 2

Thanks
Ying



j_miles
Total Points:
380
Status Points:
330
Green Belt
September 17, 2009 8:09 AM PDT
Rate
 
#9 Reply to #1

Hi,
I've never used ippiRotate_... for 90, 180, 270 degree rotations, instead I use a combination of mirror and/or transpose functions. I never had time to check if it was faster than ippiRotate but at least I'm sure to get an exact rotation (no rounding...).

For a 90 degree rotation :
ippiMirror_8u_C1R(pSrc, srcStep, pTempBuffer, srcStep, srcSize, ippAxsHorizontal);
ippiTranspose_8u_C1R(pTempBuffer, srcStep, pDst, dstStep, dstSize);
with dstSize.width = srcSize.height...

For a 270 degree rotation :
ippiTranspose_8u_C1R(pSrc, srcStep, pTempBuffer, dstStep, srcSize);
ippiMirror_8u_C1R(pTempBuffer, dstStep, pDst, dstStep, dstSize, ippAxsHorizontal);

For a 180 degree rotation :
ippiMirror_8u_C1R(pSrc, srcStep, pDst, dstStep, roiSize, ippAxsBoth);


Matthieu

We have found that Transpose is faster than Rotate at the 90-degree rotations, and yes, also avoid any potential rounding artefacts. I presume most would want 90-degree rotations to be exact. You can actually improve slightly on the speed by avoiding the Mirroring-calls. This can be done by effectively flipping either the source or the destination image "during" the transposing. This can be done by setting a negative stride and also adjust the associated pointer to point at the start of the last row/line of the image.
Otherwise, you may consider cutting down on memory use by skipping the temporary buffer and do the mirroring in-place in the 'dst' buffer.


Regards,

- Jay


mahantesh
Total Points:
115
Status Points:
65
Green Belt
September 30, 2009 12:03 PM PDT
Rate
 
#10 Reply to #2
Quoting - Ying H (Intel)

Hi Matthieu,

Thank you for your suggestion. Yes, we recomment to use ippiMirror to do special rotation like 90,180,270.

To mahantesh,

if use ippiRotate, the no-intergate interpolation, round issue are unavaidable.  ippiRotate provide one parameter IPPI_SMOOTH_EDGE to make edge look better.  But the black strips may still visiable. how width of the strips in your test? does it affect your result?

Here is small piece of code for your reference.

IppiSize srcTempSize = {w, h};
IppiSize dstTempSize = {h, w};

IppiRect srcTempRect = { 0, 0,w, h };
IppiRect dstTempRect = { 0, 0,h, w };
double xTempShift = 0.0;
double yTempShift = 1.0*w; // conterwise rotate 90 degree, origin (0, 0) will be (0, w) after rotation, so the y shift is w

/* Use this function if you need to rotate an image about an arbitrary center (xCenter, yCenter) rather than the origin (0,0), we will rotate the image by 0, 0 first, so it is not necessary to call it here
/*
//ippiGetRotateShift(0.0, 0.0, 90.0, &xTempShift, &yTempShift);

ippiSet_8u_C4R ( 0, (Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempSize );
status=ippiRotate_8u_C4R ( (Ipp8u*) srcTemp->imageData, srcTempSize, srcTemp->widthStep, srcTempRect,
(Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempRect, 90.0,
xTempShift, yTempShift, IPPI_INTER_LINEAR|IPPI_SMOOTH_EDGE);
//my test: the rotate operation will show 1 pixel width black line on upper of the rotated image)

Best Regards,
Ying


Hi Ying,

For the rotate operation using ippiRotate_8u_C3R(), we are getting black line on the rotated image. For resolutions 160x120,176x144,320x240,352x288 the line is thicker and can be easily identified. For 640x480 and higher resolutions its very thin. Is there any way to completely remove these lines? can this be fixed from IPP library? If yes then when this will be available? or any fix can be given from the application using IPP library?

Thanks,
Mahantesh


mahantesh
Total Points:
115
Status Points:
65
Green Belt
October 13, 2009 11:53 AM PDT
Rate
 
#11 Reply to #1

Hi,

we are facing one problem while rotating image data for 90 degree rotation, please find the code snippet below. Some problem with dstSize in ippiTranspose_8u_C3R() function, this function is crashing. If instead of dstSize, if we pass srcSize, it is working fine.

// destination width and height
dstSize.width = srcSize.height
dstSize.height = srcSize.width

//strides calculation
srcStep = (imageWidth * (bitcount / 8) + 3) & ~3;
dstStep = (imageHeight * (bitcount / 8) + 3) & ~3;

//For a 90 degree rotation :
ippiMirror_8u_C3R(pSrc, srcStep, pTempBuffer, srcStep, srcSize, ippAxsHorizontal);
ippiTranspose_8u_C3R(pTempBuffer, srcStep, pDst, dstStep, dstSize); // crashes here

// if dstSize is replaced by srcSize no crash for 90 degree
//ippiTranspose_8u_C3R(pTempBuffer, srcStep, pDst, dstStep, srcSize); // No crashes here


//For a 270 degree rotation :
ippiTranspose_8u_C3R(pSrc, srcStep, pTempBuffer, dstStep, srcSize);
ippiMirror_8u_C3R(pTempBuffer, dstStep, pDst, dstStep, dstSize, ippAxsHorizontal);



Please let us know if you have faced similar problem or is it the expected behavior that we should  pass srcSize where actually we have to pass dstSize or if any resolution for the crash.


Regards,
Mahantesh


Ying H (Intel)
Total Points:
5,187
Status Points:
4,687
Brown Belt
October 14, 2009 1:53 AM PDT
Rate
 
#12 Reply to #10


Hi mahantesh,

I'm looking into the ippiRotate issue and get back to you if any findings.

About the ippiTranspose function, right, you should use the size same as the source input, see the description of the function' parameter in ippiman.pdf,
roiSize  - Size of the source ROI in pixels.

So for 90 degeree rotation,
the pTempBuffer is a source with (srcSize.width, srcSize.heigh),  so you will enter srcSize there.

for 270 degree rotation, you call ippiTranspose first,
the pSrc is the input source of the function, so it also needs srcSize.

Regards,
Ying



Ying H (Intel)
Total Points:
5,187
Status Points:
4,687
Brown Belt
October 15, 2009 12:14 AM PDT
Rate
 
|Best Answer
#13 Reply to #12
Hi mahantest,

About the folded line when use ippiRotate or ippiMirror,  please see below scene,
with the code of 

 double xTempShift = 0.0;
 double yTempShift = 1.0*w;
 IppiRect srcTempRect = { 0, 0,w, h };
 IppiRect dstTempRect = { 0, 0,h, w };

 status=ippiRotate_8u_C3R ( (Ipp8u*) srcTemp->imageData, srcTempSize, srcTemp->widthStep, srcTempRect,
       (Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempRect, 90.0,
    xTempShift, yTempShift, IPPI_INTER_NN|IPPI_SMOOTH_EDGE);


We rotate a 227x149 image to 149x227 image.  
I add black edge to dst image, so you can see there is the white line on the upper of image clearly. It is the line I mentioned last time. 
It is common rounding artefacts because pixel in IPP affine transforms (include rotate operations) is not square but is a point. Rotate_Result.JPG

For workaround you can just simple to remove it by subtract 1 from yshift or xShift. for example,

status=ippiRotate_8u_C3R ( (Ipp8u*) srcTemp->imageData, srcTempSize, srcTemp->widthStep, srcTempRect,
       (Ipp8u*) dstTemp->imageData, dstTemp->widthStep, dstTempRect, 90.0,
    xTempShift, yTempShift-1, IPPI_INTER_NN|IPPI_SMOOTH_EDGE);

The line is gone.
(It is just sample, for who is using ippiRotate and has same problem, please consider such kind of  modification based on your input image.)
Rotate_RomoveLine.jpg
 
Regards,
Ying



Intel Software Network Forums Statistics

8442 users have contributed to 31547 threads and 100373 posts to date.
In the past 24 hours, we have 11 new thread(s) 33 new posts(s), and 44 new user(s).

In the past 3 days, the most popular thread for everyone has been /fpp interferes with breakpoints/stepping through code - again The most posts were made to Help with hitting maximum record length in the compiler with debug info? The post with the most views is You could save the pre-proce

Please welcome our newest member mrnm