Алгоритм коррекции искажения ствола для коррекции объектива FishEye - невозможно реализовать с помощью Java

У меня есть большая масса фотографий, снятых объективом «рыбий глаз». Поскольку я хочу выполнить некоторую обработку изображений (например, обнаружение краев) на фотографиях, я хочу удалить искажение бочки, которое сильно влияет на мои результаты.

После некоторого исследования и много прочитанных статей я нашел этостраница: Они описывают алгоритм (и некоторые формулы) для решения этой проблемы.

M = a *rcorr^3 + b * rcorr^2 + c * rcorr + d
rsrc = (a * rcorr^3 + b * rcorr^2 + c * rcorr + d) * rcorr

rsrc = distance of a pixel from the center of the source image
rcorr = distance of a pixel from the center in the corrected image
a,b,c = distortion of image d = linear scaling of image

Я использовал эти формулы и попытался реализовать это в приложении Java. К сожалению, это не работает, и мне не удалось заставить его работать. & Quot; Corrected & Quot; изображение выглядит совсем не так, как на оригинальной фотографии, а вместо этого показывает какие-то загадочные круги в центре. Смотри сюда:

http://imageshack.us/f/844/barreldistortioncorrect.jpg/ (раньше это была фотография белой коровы перед синей стеной)

Вот мой код:

protected int[] correction(int[] pixels) {

    //
    int[] pixelsCopy = pixels.clone();

    // parameters for correction
    double paramA = 0.0; // affects only the outermost pixels of the image
    double paramB = -0.02; // most cases only require b optimization
    double paramC = 0.0; // most uniform correction
    double paramD = 1.0 - paramA - paramB - paramC; // describes the linear scaling of the image

    //
    for(int x = 0; x < dstView.getImgWidth(); x++) {
        for(int y = 0; y < dstView.getImgHeight(); y++) {

            int dstX = x;
            int dstY = y;

            // center of dst image
            double centerX = (dstView.getImgWidth() - 1) / 2.0;
            double centerY = (dstView.getImgHeight() - 1) / 2.0;

            // difference between center and point
            double diffX = centerX - dstX;
            double diffY = centerY - dstY;
            // distance or radius of dst image
            double dstR = Math.sqrt(diffX * diffX + diffY * diffY);

            // distance or radius of src image (with formula)
            double srcR = (paramA * dstR * dstR * dstR + paramB * dstR * dstR + paramC * dstR + paramD) * dstR;

            // comparing old and new distance to get factor
            double factor = Math.abs(dstR / srcR);
            // coordinates in source image
            double srcXd = centerX + (diffX * factor);
            double srcYd = centerY + (diffX * factor);

            // no interpolation yet (just nearest point)
            int srcX = (int)srcXd;
            int srcY = (int)srcYd;

            if(srcX >= 0 && srcY >= 0 && srcX < dstView.getImgWidth() && srcY < dstView.getImgHeight()) {

                int dstPos = dstY * dstView.getImgWidth() + dstX;
                pixels[dstPos] = pixelsCopy[srcY * dstView.getImgWidth() + srcX];
            }
        }
    }

    return pixels;
}

Мои вопросы:
1) Правильна ли эта формула?
2) Я сделал ошибку, превратив эту формулу в программный продукт?
3) Существуют и другие алгоритмы (например,Как смоделировать эффект объектива «рыбий глаз» с помощью openCV? или вики / Distortion_ (оптика)) они лучше?

Спасибо за вашу помощь!

Ответы на вопрос(4)

Ваш ответ на вопрос