Formulas for Barrel/Pincushion distortion

barrel distortion equation
pincushion distortion glasses
barrel distortion python
radial distortion correction formula
pincushion and barrel
what causes barrel distortion
an exact formula for calculating inverse radial lens distortions
lens distortion correction algorithm

Can't understand how to get (x', y') of original (x, y) in image, for Barrel/Pincushion distortion.

Section 2 of this paper explains the transformation. Basically:

Here I made an example in Mathematica:

image processing - Formulas for Barrel/Pincushion distortion, simple barrel\pincushion distortion in opencv c++ IplImage* barrel_pincusion_dist(IplImage* img, double Cx,double Cy,double kx,double ky) { IplImage* mapx  In addition to these three, there can be “mustache” or “wave” distortion, which is barrel near the center and pincushion near the edges, or vice-versa. Distortion formulas In the equations which apply to several modules, r d is the distorted (measured) radius normalized to the center-to-corner distance.

simple barrel\pincushion distortion in opencv c++

IplImage* barrel_pincusion_dist(IplImage* img, double Cx,double Cy,double kx,double ky)
{
    IplImage* mapx = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );
    IplImage* mapy = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

    int w= img->width;
    int h= img->height;

    float* pbuf = (float*)mapx->imageData;
    for (int y = 0; y < h; y++)
    {
        for (int x = 0; x < w; x++)
        {         
            float u= Cx+(x-Cx)*(1+kx*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)));
            *pbuf = u;
            ++pbuf;
        }
    }

    pbuf = (float*)mapy->imageData;
    for (int y = 0;y < h; y++)
    {
        for (int x = 0; x < w; x++) 
        {
            *pbuf = Cy+(y-Cy)*(1+ky*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)));
            ++pbuf;
        }
    }

    /*float* pbuf = (float*)mapx->imageData;
    for (int y = 0; y < h; y++)
    {
        int ty= y-Cy;
        for (int x = 0; x < w; x++)
        {
            int tx= x-Cx;
            int rt= tx*tx+ty*ty;

            *pbuf = (float)(tx*(1+kx*rt)+Cx);
            ++pbuf;
        }
    }

    pbuf = (float*)mapy->imageData;
    for (int y = 0;y < h; y++)
    {
        int ty= y-Cy;
        for (int x = 0; x < w; x++) 
        {
            int tx= x-Cx;
            int rt= tx*tx+ty*ty;

            *pbuf = (float)(ty*(1+ky*rt)+Cy);
            ++pbuf;
        }
    }*/

    IplImage* temp = cvCloneImage(img);
    cvRemap( temp, img, mapx, mapy ); 
    cvReleaseImage(&temp);
    cvReleaseImage(&mapx);
    cvReleaseImage(&mapy);

    return img;
}

more complicated form http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html

How to Fix Barrel Distortion in Photography, occurs because the magnification of the image decreases the farther the object is from the optical axis of the lens. Wide-angle lenses include more pieces of glass that are curved so the portions of the image that are at the edges of the frame can become skewed and will reflect this curvature. Can’t understand how to get (x’, y’) of original (x, y) in image, for Barrel/Pincushion distortion. Practice As Follows. Section 2 of this paper explains the transformation. Basically: Here I made an example in Mathematica:

Distortion, simple barrel\pincushion distortion in opencv c++ IplImage* barrel_pincusion_dist(IplImage* img, double Cx,double Cy,double kx,double ky) { IplImage* mapx  Roughly, radial distortion can be classified in two families, barrel distortion and pincushion radial distortion. Regarding the k 1 coefficient in Formula (1), barrel distortion corresponds to a negative value of k 1 and pincushion distortion to a positive value of k 1 , for an application of the distortion and not a compensation.

According to Wikipedia, there can also be an r to the power 4 term too. The signs of the two constants (for the r to the 2 and r to the 4 terms) can be opposite giving handlebar distortion where the centre of the image has barrel distortion and the edge has pincushion distortion giving straight lines the appearance of a handlebar moustache.

An Exact Formula for Calculating Inverse Radial Lens Distortions, Distortion is an individual aberration that misplaces information but can be the Actual Distance (AD) to the Predicted Distance (PD) of the image using Equation 1. This is Figure 4 shows negative, or barrel, distortion in a 35mm lens system. Barrel and pincushion refer to the shape a rectangular field will take when subjected to the two distortion types, as shown in Figure 2. Figure 2: An Illustration of Positive and Negative Distortion Distortion can be calculated simply by relating the Actual Distance (AD) to the Predicted Distance (PD) of the image using Equation 1.

Distortion (optics), The results commonly take the form of “pincushion” or “barrel” distortion: Thus, in most cases, the latter can be modeled using a single parameter equation:. However, very few lenses exhibit much distortion beyond the first cubic term. Because of the cubic law, distortion increases rapidly once it begins to appear, and this makes the corners of the image of a square, for example, stretch out for positive (pincushion) distortion, or pull in with negative (barrel) distortion.

Formulas for Barrel/Pincushion distortion, Coefficient k1 from the equation, ru = rd + k1 rd3 where r is normalized to the center-to-corner distance. k1 = 0 for no distortion; k1 < 0 for pincushion distortion; k1 > 0 for barrel distortion. Coefficients h1 and h2 from the fifth-order equation, ru = rd + h1 rd3 + h2 rd5. The standard distortion equations— r u = r d + k 1 r d 3 (3rd order), r u = r d + h 1 r d 3 + h 2 r d 5 (5th order), or the arctan/tan equations— do not give a clear picture of whether distortion takes the barrel or pincushion form. And to complicate matters, some images like the one above have barrel distortion at some radii and pincushion at others.

Distortion, d parameters to correct barrel distortion. lens distortion using yet another formula. I is the input image and k is the distortion parameter. lens distortion can be one of two types: barrel distortion and pincushion distortion. In "barrel distortion", image magnification decreases with distance from the optical axis. The apparent effect is that of an image which has been mapped around a sphere (or barrel). In "pincushion

Comments
  • When recreating this code in openGL without trimming (like you have in the 1st 2 pictures) the image looked disjointed. I had more success using this algorithm geeks3d.com/20140213/…
  • Your transform is only valid for turning a rectilinear image into a distorted image, to reverse that distortion you need the inverse function which is p1 = cbrt(2 / (3 * a)); p2 = cbrt( sqrt(3*a) * sqrt( 27*a*x*x + 4 ) - 9*a*x ); p3 = cbrt(2) * pow(3*a, 2/3); return p1/p2 - p2/p3;