Билинейная интерполяционная аномалия - PullRequest
0 голосов
/ 23 февраля 2019

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

Вот мой код:

public static int getSubPixel(BufferedImage bi, double x, double y) {
    float[] topleft = new Color(bi.getRGB((int) Math.floor(x), (int) Math.floor(y))).getColorComponents(null);
    float[] topright = new Color(bi.getRGB(Math.min(bi.getWidth() - 1, (int) Math.ceil(x)), (int) Math.floor(y))).getColorComponents(null);
    float[] bottomleft = new Color(bi.getRGB((int) Math.floor(x), Math.min(bi.getHeight() - 1, (int) Math.ceil(y)))).getColorComponents(null);
    float[] bottomright = new Color(bi.getRGB(Math.min(bi.getWidth() - 1, (int) Math.ceil(x)), Math.min(bi.getHeight() - 1, (int) Math.ceil(y)))).getColorComponents(null);

    for (int i = 0; i < 3; i++) {
        topleft[i] *= topleft[i];
        topright[i] *= topright[i];
        bottomleft[i] *= bottomleft[i];
        bottomright[i] *= bottomright[i];
    }
    double decX = x % 1;
    double decY = y % 1;
    double inv_DecX = 1 - decX;
    double inv_DecY = 1 - decY;

    float red = (float) Math.sqrt((topleft[0] * inv_DecX + topright[0] * decX) * inv_DecY + (bottomleft[0] * inv_DecX + bottomright[0] * decX) * decY);
    float green = (float) Math.sqrt((topleft[1] * inv_DecX + topright[1] * decX) * inv_DecY + (bottomleft[1] * inv_DecX + bottomright[1] * decX) * decY);
    float blue = (float) Math.sqrt((topleft[2] * inv_DecX + topright[2] * decX) * inv_DecY + (bottomleft[2] * inv_DecX + bottomright[2] * decX) * decY);
    return new Color(red, green, blue).getRGB();
}

Это результат увеличения изображения 16x16 в 20 раз: original image

upscaled image

Как видите, происходит странная полоса.Я старался изобразить квадраты цветов до усреднения, затем взял квадратный корень из результата, но что-то здесь не так.Любое понимание?

PS: я понимаю, функции уже существуют для этого.Это учебное упражнение.Я пытаюсь понять процесс, делая это самостоятельно.

1 Ответ

0 голосов
/ 25 февраля 2019

Артефакты полос, которые вы видите, вызваны схемой линейной интерполяции.Ваша реализация верна (за исключением квадратов, которые не нужны и заставляют полосы сильнее в более темных областях изображения).Это то, что я вижу с правильной линейной интерполяцией (16x вместо 20x, как в OP, я дурак), но без квадратов (обратите внимание на меньше полос в темно-синих частях):

linear interpolated image

Если вы хотите избавиться от полос, используйте лучшую схему интерполяции, такую ​​как интерполяция кубического сплайна:

cubic spline interpolated image

...