# Apply quadratic function to an image

Hello.

I have a quadratic function I would like to apply to my image. The transformation has the following form:

• x' = A + Bx + Cy + Dxx + Exy + Fyy
• y' = G + Hx + Iy + Jxx + Kxy + Lyy

For a linear transformation:

• x' = A + Bx + Cy
• y' = D + Ex + Fy

it was easy because I could use WarpAffine by putting the coefficients in a 3x2 matrix. Moreother, is it easy to get the value of rotation angle and scale ?

Again, with the linear transformation, rotation angle is easily computed with atan2(B, C). Scale is (sqrt(BB + CC) and shifts are A and D.

edit retag close merge delete

@LBerger provided a sample code in this post ( don't forget to upvote the question and the answer if you find it useful)

( 2017-08-28 10:40:34 -0500 )edit
1

It's not the same...the question is about a quadratic deformation of the image, the answer you linked creates a quadratic brightness function...

( 2017-08-28 13:39:10 -0500 )edit

Sort by » oldest newest most voted

If you have the formula and the parameters, you can use it directly on the image.

for(int y=0;y<src.rows;y++)
for(int x=0;x<src.cols;x++) {
xp=A+B*x+C*y+D*x*x+E*x*y+F*y*y;
yp=G+H*x+I*y+J*x*x+K*x*y+L*y*y;
dst.at<uchar>(xp,yp)=src.at<uchar>at(x,y);
}


or, even better, compute the inverse function: x=M+Nx'+Oy'+Px'x'+Qx'y'+Ry'y'... and do the same by iterating xp and yp.

Note: check if xp and yp are in the image before setting them.

If it works well, you can to parallelize the outer loop using TBB to make it very fast.

Concerning the rotation and scale: they are still affine operations, so they affect the x and y terms. So you can get their values using the B and C parameters.

more

Thank you for your answers. But I'm afraid that is a too easy approach. Indeed, I think I would need interpolation algorithm in this case. This is the reason I would expect a function doing that. A good think could be to transform my matrix to an homographic matrix, but I don't know how to do it.

( 2017-08-28 15:16:44 -0500 )edit

It's simple to interpolate. You go with the inverse formula (calculate x,y from x',y'), and instead of src.at(x,y) use the following linear interpolation function:

(src.at<uchar>(xi,yi)*(1-xf)+src.at<uchar>(xi+1,yi)*xf)*(1-yf)+(src.at<uchar>(xi,yi+1)*(1-xf)+src.at<uchar>(xi+1,yi+1)*xf)*yf


where xi=(int)x and xf=x-xi

( 2017-08-29 03:48:45 -0500 )edit

Oh gosh .... I have to find the the way to compute the inverse formula. Thank you.

( 2017-08-29 04:20:50 -0500 )edit

Official site

GitHub

Wiki

Documentation

## Stats

Asked: 2017-08-28 09:08:26 -0500

Seen: 251 times

Last updated: Aug 29 '17