Аффинное преобразование с интерполяцией - PullRequest
4 голосов
/ 23 октября 2011

Я хотел бы сделать аффинное преобразование на растровом изображении с очень низким разрешением, и я хотел бы сделать это при сохранении максимального объема информации.

Мои входные данные представляют собой 1-битное изображение 64 х 64 пикселей, написанное от руки, и мои выходные данные будут в оттенках серого и с более высоким разрешением. После анализа изображения я строю серию аффинных преобразований (вращение, масштабирование, сдвиг, сдвиг), которые я мог бы умножить в одну матрицу аффинных преобразований.

Моя проблема заключается в том, что, учитывая входное изображение и мою вычисленную матрицу аффинного преобразования , как я могу рассчитать мое выходное изображение с максимально возможным качеством? Я читал статьи о различных методах интерполяции, но все они о том, как выполнять интерполяцию для масштабирования, а не для общих аффинных преобразований.

Вот демонстрация, которая делает именно то, что я ищу. Учитывая матрицу аффинного преобразования и метод интерполяции, она вычисляет изображение.

http://bigwww.epfl.ch/demo/jaffine/index.html

Не могли бы вы объяснить, какие шаги необходимы для вычисления полутонового изображения с более высоким разрешением (например, 4x), если у меня есть 1-битный вход с более низким разрешением и заданная матрица аффинного преобразования T?

Можете ли вы связать меня с некоторыми исходными кодами или учебниками или статьями или, возможно, даже книг о том, как реализовать линейную, кубическую или лучшую интерполяцию с аффинным преобразованием?

Мне нужно реализовать эту проблему в Java, и я знаю, что в Java есть класс Affine, но я не знаю, реализует ли он интерполяцию. Знаете ли вы какую-либо библиотеку C ++ или Java, в которой приятно читать код для выяснения того, как написать алгоритм для выполнения аффинного преобразования с использованием интерполяции?

Существуют ли свободно доступные библиотеки для Java или C ++, которые имеют встроенные функции для вычисления аффинного преобразования с использованием интерполяции?

Ответы [ 2 ]

1 голос
/ 29 октября 2011

ОК, вот решение, которое я выбрал.

  1. Я преобразовал весь свой массив [] [] в объект BufferedImage

    static BufferedImage BImageFrom2DArray(float data[][]) {
        int width = data.length;
        int height = data[0].length;
        BufferedImage myimage = new BufferedImage(width, height,  BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int value = (int) ((1f - data[x][y]) * 255f);
                myimage.setRGB(y, x, (value << 16) | (value << 8) | value);
            }
        }
        return myimage;
    }
    
  2. Применение аффинного преобразования с использованием AffineTransformOp с бикубической интерполяцией

        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC);
        BufferedImage im_transformed = op.filter(im_src, null);
    
  3. Превратил объект BufferedImage в массив [] []:

        static float[][] ArrayFromBImage(BufferedImage bimage, int width, int height) {
        int max_x = bimage.getWidth();
        int max_y = bimage.getHeight();
        float[][] array = new float[width][height];
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                float red, alpha, value;
                int color;
                if (x >= max_x || y >= max_y) {
                    array[y][x] = 0;
                } else {
                    color = bimage.getRGB(x, y);
                    alpha = (color >> 24) & 0xFF;
                    red = (color >> 16) & 0xFF;
                    value = 1f - red / 255;
                    if (alpha == 0) {
                        array[y][x] = 0;
                    } else {
                        array[y][x] = value;
                    }
                }
            }
        }
        return array;
        }
    
1 голос
/ 23 октября 2011

Те же люди, с которыми вы связались, имеют реализацию C с несколькими вариантами интерполяции здесь .Вы могли бы, вероятно, использовать JNI, чтобы обернуть его.Существует также JavaCV , который оборачивает OpenCV.OpenCV содержит warpAffine, который имеет интерполяцию.Также ознакомьтесь с Java Advanced Imaging API здесь .

...