Реализация суперсэмплинга для высококачественного даунскейлинга

Я хочу создать растровые изображения с уменьшенным масштабом (оригинальное растровое изображение, загруженное из актива) с высоким качеством, сравнимым с качеством растровых изображений, масштабированных с помощью профессионального программного обеспечения, такого как Paint.net (в Paint.NET алгоритм масштабирования выбирается в поле под названием «Интерполяция». самая высокая настройка использует суперсэмплинг)?

Я понимаю, как реализовать суперсэмплинг для сглаживания. В целях сглаживания исходное изображение визуализируется в более высоком разрешении, а затем подвергается субдискретизации. Например, чтобы получить целевое изображение 100x100, вы должны отрендерить сцену до 200x200, а затем уменьшить ее разрешение с помощью сетки 2x2.

Но как алгоритм может справиться с понижением разрешения, скажем, с 400x400 до 175x175 для целей масштабирования. Сетка в этом случае должна быть ~ 2.285x2.285. Итак, как можно реализовать суперсэмплинг для целей масштабирования?

Спасибо

РЕДАКТИРОВАТЬ: мой текущий алгоритм выглядит так:

private Bitmap downscale(Bitmap src, int targetWidth, int targetHeight){
    Bitmap target = Bitmap.createBitmap(targetWidth, targetHeight, Config.ARGB_8888);
    float w = src.getWidth()/(float)targetWidth;
    float s = src.getHeight()/(float)targetHeight;
    int color = 0;
    int g = 0;
    for(int i=0;i<target.getWidth();++i){
        for(int j=0;j<target.getHeight();++j){
            color = 0;
            g = 0;
            for(float k =i*w;k<roundUp((i+1)*w);++k){
                for(float l=j*w;l<roundUp((j+1)*s);++l){
                    ++g;
                    color+=src.getPixel((int)k, (int)l);
                }
            }
            target.setPixel(i, j, color/g);
        }
    }
    return target;

}

На изображении показано то же растровое изображение 100x100, масштабированное до 54x54. Левый масштабирован Paint.Net, а правый — моим алгоритмом. Выглядит не очень хорошо... Как я могу улучшить свой код?


person user2224350    schedule 07.09.2013    source источник


Ответы (1)


Чтобы рассчитать средний цвет, вам необходимо рассчитать каждое значение a-,r-,g-,b отдельно

Я изменил свой код, и теперь он работает довольно хорошо.

    public static Bitmap downscaleBitmap(Bitmap src, int targetWidth, int targetHeight, int off){
    float r = (src.getWidth()-off)/(float)targetWidth;
    float s = (src.getHeight()-off)/(float)targetHeight;
    Bitmap target = Bitmap.createBitmap(Math.round(src.getWidth()/r), Math.round(src.getHeight()/s), Config.ARGB_8888);
    r = src.getWidth()/(float)target.getWidth();
    s = src.getHeight()/(float)target.getHeight();
    int argb;
    int red;
    int green;
    int blue;
    int alpha;
    float wx;
    float wy;
    float n;
    for(int i=0;i<target.getWidth();++i){
        for(int j=0;j<target.getHeight();++j){
            red = 0;
            green = 0;
            blue = 0;
            alpha = 0;
            n=0;
            for(int k =(int)(i*r);k<roundUp((i+1)*r);++k){
                if(k<i*r){
                    wx = k-i*r+1;
                }else{
                    if(k+1>(i+1)*r)
                        wx = (i+1)*r-k;
                    else
                        wx = 1;
                }
                for(int l=(int)(j*s);l<roundUp((j+1)*s);++l){
                    if(l<j*s){
                        wy = l-j*s+1;
                    }else{
                        if(l+1>(j+1)*s)
                            wy = (j+1)*s-l;
                        else
                            wy = 1;
                    }
                    n+=wy*wx;
                    argb=src.getPixel(k, l);
                    red += wx*wy*Color.red(argb);
                    green += wx*wy*Color.green(argb);
                    blue += wx*wy*Color.blue(argb);
                    alpha += wx*wy*Color.alpha(argb);

                }
            }
            target.setPixel(i, j, Color.argb((int)(alpha/n), (int)(red/n), (int)(green/n), (int)(blue/n)));
        }
    }
    return target;
}
person user2224350    schedule 10.09.2013
comment
Мы используем вашу реализацию, и у нас возникли проблемы с некоторыми размерами. Это ваша окончательная версия? В остальных случаях это дает отличные результаты. - person Arlo; 25.03.2015